排序---冒泡排序和抖动排序(shaker sort)

  • 冒泡排序(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\t", s[i]); printf("\n"); } 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\ty%d\n", x, y); //测试shaker_sort函数 int s[N]; printf("Init data:\n"); init_array(s, 0, N); printf("After shaker-sort data:\n"); shaker_sort(s, 0, N); print_array(s, 0, N); printf("After bubble-sort data:\n"); //bubble_sort(s, 0, N); //print_array(s, 0, N); printf("%f\n", (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

posted @ 2014-11-12 10:50  哈士奇.银桑  阅读(895)  评论(0)    收藏  举报