zoukankan      html  css  js  c++  java
  • 排序---冒泡排序和抖动排序(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 ", 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

  • 相关阅读:
    《大型网站技术架构:核心原理与案分析》阅读笔记05
    软件体系结构(1)
    《大型网站技术架构:核心原理与案分析》阅读笔记04
    C/C++
    NIO蔚来自动驾驶实习生技术一面
    Intern Day86
    面试常考
    中国赛宝实验室C++技术一面
    Intern Day85
    Intern Day85
  • 原文地址:https://www.cnblogs.com/jhooon/p/4091450.html
Copyright © 2011-2022 走看看