1.冒泡排序
基本思想:
冒泡排序是一种交换排序,核心是冒泡。通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如水底下的气泡一样逐渐向上冒。
2 .举个例子
待排序数组:21,35, -2, 5
第一轮排序:
(1)21, 35,-2, 5 ----21跟35比较,不交换
(2)21, -2,35, 5 ----35跟-2比较,交换
(3)21, -2,5, 35 ----35跟-5比较,交换
第一轮过后35这个最大的元素固定到了最后
第二轮排序:
第一轮已经让最大的数35固定,所以只需要对前面三个数进行比较
(1)-2, 21,5, 35 ----21跟-2比较,交换
(2)-2, 5,21, 35 ----21跟5比较,交换
(3)-2, 5,21, 35 ----21跟5比较,交换
第二轮过后21这个最二大的元素固定到了最后
第二轮排序:
只对前两个元素进行排序
(1)-2, 5,21, 35 -----2跟5比较,不交换
3.总结:
如果总的元素个数为n,那么从上边的排序过程可以看出:
(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环
(2)每轮排序比较的次数逐轮减少
(3)如果发现在某趟排序中,没有发生一次交换, 我们可以提前结束冒泡排序。
4.冒泡排序代码实现:
#include <stdio.h>
void BubbleSort(int arr[],int sz)
{
//循环趟数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1;//假设已经是有序
//一趟冒泡排序的过程
int j = 0;
//一对元素的比较,每轮比较的次数逐轮减少,所以再减去一个i
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;
flag = 0;//如果交换,flag = 0
}
}
if (flag == 1)//看flag是否还为1
{
break;//如果为1,提前结束循环
}
}
}
void Print(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//我们想把数组进行排序,排为升序
int sz = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, sz);
Print(arr, sz);//打印
return 0;
}
好了,以上就是我对冒泡排序的理解。