- 冒泡排序(Bubble Sort)很简单,如下图1所示,元素从下到上,遇到比当前元素小的交换,直到到达顶端。就像水里的气泡一样,小的最先升到顶端。
冒泡排序C语言代码:
1 void bubble_sort(int *s, int l, int r)//s表示整形数组,元素从l到r-1. 2 { 3 int i, j; 4 for(i=l; i<r-1; ++i) 5 for(j=r-1; j>i; --j) 6 if(s[j] < s[j-1]) 7 exchange(s+j, s+j-1);//交换元素 8 }
- 抖动排序(shaker sort)冒泡排序的一种变形,冒泡排序只是一个方向,抖动排序变成两个方向:执行过程中,不断的更改从左到右和从右向左的数据扫描顺序,即从左到右找最大的放到未排序的最后,从右向左找最小的放到未排序的最前面。
抖动排序C语言代码:
void shaker_sort(int *s, int l, int r) { int i, j, m, n; i = l; m = r - 1; while(1) { if(m <= i) break; for(j=m; j>i; --j)//从右向左交换小的 { if(s[j] < s[j-1]) exchange(s+j, s+j-1); } ++i; for(n=i; n<m; ++n)//从左向右交换大的 { if(s[n+1] < s[n]) exchange(s+n+1, s+n); } --m; } }
- 所有代码
/******************** *抖动排序 *冒泡排序的一种,不断的更改从左到右 *从右向左的数据扫描顺序。 *tong/2014/11/12 ***********************/ #include<stdlib.h> #include<stdio.h> #include<time.h> #define N 10000 inline void exchange(int *x, int *y) { *x ^= *y; *y ^= *x; *x ^= *y; } //冒泡 void bubble_sort(int *s, int l, int r) { int i, j; for(i=l; i<r-1; ++i) for(j=r-1; j>i; --j) if(s[j] < s[j-1]) exchange(s+j, s+j-1); }
//抖动 void shaker_sort(int *s, int l, int r) { int i, j, m, n; i = l; m = r - 1; while(1) { if(m <= i) break; for(j=m; j>i; --j) { if(s[j] < s[j-1]) exchange(s+j, s+j-1); } ++i; for(n=i; n<m; ++n) { if(s[n+1] < s[n]) exchange(s+n+1, s+n); } --m; } } void print_array(int *s, int l, int r) { int i; for(i=l; i<r; ++i) printf("%d ", s[i]); printf(" "); } void init_array(int *s, int l, int r) { srand((unsigned int)time(NULL)); int i; for(i=l; i<r; ++i) { s[i] = rand() % 100; } print_array(s, l, r); } int main() { //测试exchange函数 int x = 3, y = 4; exchange(&x, &y); printf("exchange:x%d y%d ", x, y); //测试shaker_sort函数 int s[N]; printf("Init data: "); init_array(s, 0, N); printf("After shaker-sort data: "); shaker_sort(s, 0, N); print_array(s, 0, N); printf("After bubble-sort data: "); //bubble_sort(s, 0, N); //print_array(s, 0, N); printf("%f ", (double)clock()/CLOCKS_PER_SEC);//程序开始执行后占用的处理器时间 return 0; }
- 改进
可以判断一次循环是否有交换,如果没有,即认为有序。
- 对比
对10000个数(0~100)做了4次实验,数据如下(单位:秒):
不排序:0.009649
冒泡:0.7254、0.7231、 0.7199、 0.7183
抖动:0.6445、 0.6486、 0.6434、 0.6478
- 参考
1:http://www.cnblogs.com/cj723/archive/2011/04/15/2016689.html