题目:
给一个长度为 n 整数数组排序,即实现一个可以给任意长度数列排序的工具
输入描述:
第1行输入1个正整数 n ,表示数组长度。
第2行输入 n 个正整数,表示数组中每个元素的值
输出描述:
输出排序后的数组
解题思路:
- 利用calloc或者malloc动态开辟空间,用来存储n个元素的数列
- 利用冒泡排序对数列进行排序
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
//冒泡排序
void Bubble_sort(int* const p, int num)
{
assert(p);
int i = 0;//控制总冒泡的次数
int j = 0;//控制每一次冒泡时,需要操作的元素数量
int tem = 0;//进行交换时的临时变量
int flag = 0;//标志位,记录是否发生元素交换
//num个元素,即需要进行num - 1次冒泡
for (i = 0; i < num - 1; i++)
{
//每次进入循环,标志位重置为0
flag = 0;
//每次减少1个数(每次冒泡完成,即有1个数已被排序完成)
//
//j不能等于数组的最后一个元素
//所以结束条件为: num - i - 1
//因为:
// 1.j为最大下标时, 执行*(action + j + 1),会造成越界访问
// 2.j不是最大下标时,*(action + j + 1)已经被排序结束,无需再进行比较
for (j = 0; j < num - i - 1; j++)
{
if (j != num - i - 1)
{
//如果前面的数大于后面的数,则需要替换
if (*(p + j) > *(p + j + 1))
{
tem = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = tem;
//发生交换,更新标志位
flag = 1;
}
}
}
//如果一轮中为发生任何排序,说明排序已经完成,可提前结束排序
if (!flag)
{
break;
}
}
}
int main()
{
int n = 0;
int* p = NULL;
int i = 0;
//录入n
scanf("%d", &n);
//开辟n个int的空间,用来放置数列
p = calloc(n, sizeof(int));
//开辟空间失败,报错误信息并提前结束程序
if(p == NULL)
{
perror("calloc");
return 1;
}
//录入元素
for (i = 0; i < n; i++)
{
scanf("%d", p + i);
}
//进行排序
Bubble_sort(p, n);
//输出排序好的数列
for (i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
//释放calloc的空间
free(p);
p = NULL;
return 0;
}