冒泡排序是通过一系列的“交换”来完成的
过程:
首先第一个元素与第二个元素比较,如果第一个元素比较大,两个交换。此时第一个元素就变成了第二个元素。
9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1-->8 , 9 , 7 , 6 , 5 , 4 , 3 , 2 , 1
然后第二个元素与第三个元素比较。。。
8 , 9 , 7 , 6 , 5 , 4 , 3 , 2 , 1-->8 , 7 , 9 , 6 , 5 , 4 , 3 , 2 , 1
以此类推,第一次排序的结果就为:8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 9
此时,并没有得到想要的 小——>大 的顺序排列 但是发现9是最大的数,已经放到了最后。那就可以在接下来的交换循环中不考虑它。 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 9 对前面的元素进行比较交换 得出:7 , 6 , 5 , 4 , 3 , 2 , 1 , 8 9 同理,下次比较交换也可以不考虑8 以此类推 就会得出1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 |
如果说从第一个元素移动到最后的过程称为一趟,有n个元素
9移动一趟,8,7,6,5,4,3,2各移动一趟,最后剩1,无法比较。
则一共需要(n-1)趟。
9交换了8次,8交换了7次..........
需要交换剩余需要比较交换的元素个数-1.
程序:
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
int i;
for (i = 0; i < sz-1; i++) //确定趟数
{
int j,temp=0;
for (j = 0; j < sz - 1 - i; j++)//每次交换的次数
if (arr[j]>arr[j+1]) // "<"是倒序排列,">"是正序排列
{
temp = arr[j]; //交换(一个元素与它下一个元素的交换)
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };//确定一个原始序列
int sz = sizeof(arr) / sizeof(arr[0]);//确定这个序列的元素个数 (9个)
bubble_sort(arr, sz);
return 0;
}