冒泡算法
冒泡排序:从序列的一端开始,依次比较相邻的两个数的大小,直到另一端,始终将更大或更小的一个数与数组第一个索引的数进行交换,每经过一轮交换,下一轮的交换起始点索引+1,当最大经过数组长度-1的轮次后,排序完成,整个过程就像一个个从大到小的泡泡从底部向上冒出,故称为冒泡排序。
设数组长度为N。
每轮比较相邻的前后两个数据,如果前面数据大于或者小于后面的数据,就将二个数据交换。
这样每轮对数组的第0个数据到N-1个数据进行一次遍历后,最大或者最小的一个数据就到数组第N-1个位置。
第一轮比较到下标为N-1的数据(最后一个),以后每次比较都-1。
#include <stdio.h>
int main () { int list[10] = {4,37,94,57,64,29,83,18,19,40}; int i, j, temp; for (i = 0; i < 9 ; i++) for (j = 0; j < 9 - i; j++) if (list[j ] > list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } for (i = 0;i < 10; i++) printf("%d\n",list[i]); }
|
优化算法
冒泡有一个最大的问题就是不管序列有序还是没序,双层循环的每一次比较都执行了。
下面对其进行优化,设置一个标志,如果这一轮发生了交换,则为1,否则为0。
如果有一趟没有发生交换,说明排序已经完成,则结束排序。
#include <stdio.h>
int main () { int list[10] = {4,37,94,57,64,29,83,18,19,40}; int j, temp; int i = 9; int bool = 1; while(bool) { bool = 0; for (j = 0; j < i; j++) if (list[j] > list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; bool = 1; } i--; } for (i = 0;i < 10; i++) printf("%d\n",list[i]); }
|