目录
一、问题
二、冒泡排序的思想
三、举例
四、算法分析
五、代码实现
现有一个整型数组(乱序),并且写一个函数(Sort)对数组进行排序,顺序要求升序。
两两相邻的元素进行比较,有可能需要交换(下面有图文说明能帮助大家理解)
对于升序,比较相邻的元素。如果第一个比第二个大,就交换。对每一对相邻元素作同样的工作,从开始第一对到结尾到最后一对。这一趟做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
要求:升序
1)第一趟排序:
第一次排序:5和9比较,位置不变 5,9,3,6
第二次排序:9和3比较,位置交换,5,3,9,6
第三次排序:9和6比较,位置交换,5,3,6,9
总结:第一趟总共进行3次排序。
2)第二趟排序:
第一次排序:5和3比较,位置交换, 3,5,6,9
第二次排序:5和6比较,位置不变, 3,5,6,7
总结:第二趟总共进行2次排序。
3)第三趟排序 :
第一次排序:3和5比较,位置不变 3,5,6,7
到目前位置已经为有序的情形了。
总结:第二趟总共进行1次排序。
到目前位置已经为有序的情形了。
N个数字要排序,总共进行N-1趟排序,每x趟的排序次数为(N-x)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数。
#include
void 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 i = 0; //不同函数内部可以取相同变量名int arr[] = { 2,6,8,7,6,0,1,5,9,3 };int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数Sort(arr,sz);for (i = 0; i < sz; i++){printf("%d ", arr[i]);}}
程序结果: