冒泡排序
例如数组int arr= {10,9, 8,7, 6,5, 4,3, 2,1}
第一趟 ,用数组的第一个数与第二个数作比较,当大于第二个数时,两个数交换,然后第二个数与第三个数做比较,如果大于第三个数,两个数交换…最后得到9 8 7 6 5 4 3 2 1 10 比较9次
第二趟,依次比较,最后得到8 7 6 5 4 3 2 1 9 10 比较8次
第三趟,依次比较,最后得到7 6 5 4 3 2 1 8 9 10 比较7次
…
第九趟,得到1 2 3 4 5 6 7 8 9 10 比较1次
代码如下:
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)//比较sz-1趟
{
int j = 0;
for (j = 0; j < sz - i -1; j++)//每趟比较sz - i - 1 趟
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
代码优化:
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
int flag = 1;
for (j = 0; j < sz - i -1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
当数组已经是升序序列的时候就不必再进行比较排序,所以在每一趟比较时,假设数组已经按升序排列,置 flag= 1,如果发生交换,说明数组还未按升序排列,将flag=0,每趟比较完,如果flag仍为1,则跳出循环,停止比较,比较完毕。
结果演示: