冒泡排序算法思想:两两相邻的元素进行比较,并且有可能的话进行交换, 假设现在有一组数据:5 1 4 2 8 现在要对这组数据进行升序排列。我们利用冒泡排序的思想。
第一趟:5 1 4 2 8--->1 5 4 2 8--->1 4 5 2 8--->1 4 2 5 8--->1 4 2 5 8
一趟冒泡排序解决一个数字,第一趟解决8后,剩余的待排序的数字为1 4 2 5 (8)<对8 不进行排序,因为第一趟已经把它排到应该排序的位置> 接下来,进行第二趟排序:
第二趟:1 4 2 5 (8)--->1 4 2 5 (8)--->1 2 4 5 (8)--->1 2 4 5 (8)
第二趟冒泡排序解决了数字5,剩余的待排序的数字是1 2 4 (5) (8)
第三趟:1 2 4 (5) (8)--->1 2 4 (5) (8)--->1 2 4 (5) (8)
第三趟冒泡排序解决了数字4,剩余的待排序的数字是1 2 (4) (5) (8)
第四趟:1 2 (4) (5) (8)--->1 2 (4) (5) (8)
通过以上分析,我们可以看到 5 个数字进行了 4 趟冒泡排序之后,才达到了我们想要的效果。如果有n个数字,我们需要n-1趟冒泡排序。
而我们又发现,在第1趟排序中,5个数字待排序,我们进行了4次比较,在第2趟冒泡排序中,有4个数字待排序,我们进行了3次比较,由此我们可以得出在第 k 趟中,我们需要进行n-k次比较。
通过以上分析,我么可以用代码实现:
void bubble_sort(int* arr,int sz)
{
int i = 0;
for (i = 0; i <= sz - 1; i++)//确定趟数
{
//一趟冒泡排序的过程
int j = 0;
for (j = 0; j < sz - 1 - i; j++)//比较的次数
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}//升序 - 前面大于后面需要进行交换
}
}
}
int main()
{
int arr[] = { 5,1,4,2,8 };
//确定趟数 - 趟数和元素个数有关,所以我们需要求元素个数
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;
}
以上程序的运行结果如下: