//冒泡排序:
//优化版口诀:序而不排 -> 优化原理:证实已经有序,不需要再次循环 -> 代码角度实现优化:内重循环已证实有序,外重循环不需要再次循环可以停止了。建立flag标记告诉外层循环有序这件事。
//何时为有序?就是内存循环在从0到尾往前比较时,没出现过一次交换的动作,则证明从此次大趟开始,剩下的所有数据已经有序。
#include <stdio.h> void mySwap(int *pa ,int *pb) { *pa ^= *pb; *pb ^= *pa; *pa ^= *pb; } //基础版 void popSort(int *p,int n)//升序 { int i,j; for(i = 0;i<n-1;i++)//i控制的是比较多少大趟 { for(j = 0;j<n-1-i;j++)//j控制的是比较位置 { if(p[j]>p[j+1]) { mySwap(&p[j],&p[j+1]); } } } } //优化版 void popSort2(int *p,int n)//升序 { int i,j; int flag; for(i = 0;i<n-1;i++) { flag = 1; for(j = 0;j<n-1-i;j++) { if(p[j]>p[j+1]) { mySwap(&p[j],&p[j+1]); flag = 0; } } if(flag) break; } } int main(void) { int arr[10] = {1,3,5,7,9,2,4,6,8,0}; popSort2(arr,10); int i; for(i = 0;i<10;i++) printf("%d ",arr[i]); return 0; }