zoukankan      html  css  js  c++  java
  • 冒泡排序

    冒泡排序是主要排序算法的一种,思路简单明了,在数据基本有序的情况下,采用改进版,排序方法十分有效。

    冒泡排序的基本思想是比较相邻两个元素,如果不是有序则进行交换,重复这个操作,直到全部数据有序为止。冒泡排序对待排序的数据(关键码)进行多趟处理,每一趟可以将一个大的数交换到右边适当的位置。

    它的缺点是数据交换次数有可能比较多。

    这里给出两个函数,一个是排序过程中,不考虑是否已经有序,按照固定的套路进行比较和交换,比较次数比较多;另外一个版本是如果已经有序,则停止处理,有额外的标志置值操作。

    原始数据使用随机函数生成。

    采用结构化程序设计,可以很容易改为从标准输入或文件读入数据,只需要修改函数getData即可。

    数据个数由宏定义给出,也可以轻松地改为输入。

    /*
     *
     * 冒泡排序算法程序:
     *
     * 一般的冒泡排序程序是函数bubblesort1。
     * 数据基本有序的情况下,应该使用改进版,即函数bubblesort2。
     */
    
    #include <stdio.h>
    #include<stdlib.h>
    #include <time.h>
    
    #define N 7
    
    void getData(int [], int);
    void outputData(int [], int);
    
    void bubblesort1(int a[], int n);
    void bubblesort2(int a[], int n);
    
    int main(void)
    {
      int a[N];
    
      getData(a, N); /* 获得数据放入数组a中 */
    
      printf("Unordered datas: ");
      outputData(a, N);
    
      bubblesort2(a, N);
    
      printf("In sorted order: ");
      outputData(a, N);
    
      return 0;
    }
    
    /* 冒泡排序 */
    void bubblesort1(int a[], int n)
    {
        int i, j;
    
        for(i=n-1; i > 0; i--)
        {
            for(j=1; j<=i; j++)
                if(a[j-1] > a[j]) {
                    int temp = a[j-1]; /* 交换两个相邻的数 */
                    a[j-1] = a[j];
                    a[j] = temp;
                }
        }
    }
    
    /* 冒泡排序(改进版) */
    void bubblesort2(int a[], int n)
    {
        int i, j, swapflag=1;
    
        for(i=n-1; swapflag && i > 0; i--)
        {
            swapflag = 0;
            for(j=1; j<=i; j++)
                if(a[j-1] > a[j]) {
                    int temp = a[j-1]; /* 交换两个相邻的数 */
                    a[j-1] = a[j];
                    a[j] = temp;
                    swapflag = 1;
                }
        }
    }
    
    void getData(int d[], int n)
    {
        time_t t;
        srand((unsigned) time(&t));  /* 设置随机数起始值 */
    
        int i;
        for(i=0; i < n; i++)
            d[i] = rand() % 1000; /* 获得0-999之间的整数值 */
    }
    
    void outputData(int d[], int n)
    {
        int i;
        for (i = 0; i < n; i++)
          printf("%d ", d[i]);
        printf("
    ");
    }

    冒泡排序函数:

    /* 冒泡排序 */  
    void bubblesort1(int a[], int n)  
    {  
        int i, j;  
      
        for(i=n-1; i > 0; i--)  
        {  
            for(j=1; j<=i; j++)  
                if(a[j-1] > a[j]) {  
                    int temp = a[j-1]; /* 交换两个相邻的数 */  
                    a[j-1] = a[j];  
                    a[j] = temp;  
                }  
        }  
    }  

    冒泡排序(改进版)函数:

    void bubblesort2(int a[], int n)  
    {  
        int i, j, swapflag=1;  
      
        for(i=n-1; swapflag && i > 0; i--)  
        {  
            swapflag = 0;  
            for(j=1; j<=i; j++)  
                if(a[j-1] > a[j]) {  
                    int temp = a[j-1]; /* 交换两个相邻的数 */  
                    a[j-1] = a[j];  
                    a[j] = temp;  
                    swapflag = 1;  
                }  
        }  
    }


  • 相关阅读:
    Runloop 新的看法
    如何利用openCV做灰度图片
    WebViewJavascriptBridge使用说明(iOS)
    页面滑动返回和点击返回按钮动作实现;
    获取设备UDID、IMEI、ICCID、序列号、Mac地址等信息
    设计模式----单例模式
    多线程理论知识 -- 小白的教程
    SQLite 的创建与编辑
    strong,weak, retain, assign的区别
    CGContextRef 画线简单用法
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564955.html
Copyright © 2011-2022 走看看