问题:
给数组进行从小到大的升序排序。
思想:
- 一般给冒泡排序,进行封装,写成一个函数。
- 这就需要让数组传进去,而传数组,实际传的数组的首元素的地址,因此如果在冒泡内部,进行数组数据个数的计算,用sizeof(a)/sizeof(a[0]);实际上为1/1=1,因为这里面的a,不是数组名,而是元素首地址,代表不了整个数组。
- 对于数组名,如 int a[10];只有在主函数中,sizeof(a)和&a,的时候,代表整个数组,此外&a+1.则是表示数组末尾元素地址,直接跨越整个数组。其他情况,统统表示元素首地址。
- 因此,给数组传参时,bubble_sort(a),则传的a的首元素地址。这样传进函数的,就是个指针变量,int *a,此时指针在64位操作系统下时8个字节,在32位操作系统下4个字节。而int a[0]则是数组变量,int型数组,一个变量位4字节。
- 因此,我们需要在主函数内,给数组内数据个数算出来,然后传进函数,
- 之后写冒泡排序。总共需要冒泡n-1趟,而每一趟,都需要从头到尾挨个对比,每一趟都会少对比一个,因为每一趟结束后,数值大的到了最后,第二天就不用管他了,因此每次少1.
- 此外,为了优化。不是所有数组都是无序的,有的只有一个数字有错,却还是要全部趟次对比完。
- 因此,在每趟对比前,定义个flag,记录是否发生改变,如果发生改变,flag变为0,否则变为1,证明该数组内,数字有序了,直接break跳出,不执行后面操作。
- 冒泡排序大致思路:一维数组排序,两个for循环,外循环时运行的总趟数,内循环,则是进行数组的实际对比,每趟进行时,两两比较,如果比它小,则交换位置,数大的往后跑,每趟结束后,此趟的数落在最后,就不用动了,因此下一趟对比,就不用管它了,所以每次对比数少1.
代码如下:
#include <stdio.h>
void bubble_sort(int *a,int n)
{
int i, j;
for (i = 0; i < n - 1; i++)
{
int flag = 1;
for (j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j+ 1] = temp;
flag = 0;
}
}
if (flag == 1)//如果,数组中,已经不需要比大小了,直接跳出,不需要给趟数跑完,因为每一趟,都在检查数组内元素是否大于小于,
break;
}
}
int main()
{
int a[10] = {5,2,3,6,4,8,9,5,6,23};
int sz = sizeof(a) / sizeof(a[0]);
int p;
for (p = 0; p < sz; p++)
{
printf("%d ", a[p]);
}
printf("\n");
bubble_sort(a,sz);
int i;
for (i = 0; i < sz; i++)
{
printf("%d ", a[i]);
}
return 0;
}