排序---冒泡排序和抖动排序(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

浙公网安备 33010602011771号