zoukankan      html  css  js  c++  java
  • 三种初级排序(选择、插入、冒泡)

    选择排序:每次从剩余数组中选择一个最小的,然后从0开始和相应位置的数字作交换,假设数组长度为n,外层遍历n次,内层查找n-1次,时间复杂度为Θ(n^2):

     1 void SelectionSort(int * x,int length)
     2 {
     3     //外层遍历
     4     for(int i = 0;i < length - 1;i++)
     5     {
     6         //每次遍历查找最小时初始化中间变量
     7         int min_value = Max;
     8         int min_position = 0;
     9         //内层遍历出最小值
    10         for(int j = i;j < length;j++)
    11         {
    12             if(x[j] < min_value)
    13             {
    14                 min_value = x[j];
    15                 min_position = j;
    16             }
    17         }
    18         //和相应位置做交换
    19         int temp = x[i];
    20         x[i] = min_value;
    21         x[min_position] = temp;
    22     }

    插入排序:和选择排序不同的是,插入排序的内层遍历是依次和已排序好的数组部分作比较,虽然时间复杂度依然是Θ(n^2):

     1 void InsertionSort(int * x,int length)
     2 {
     3     //从第二个还是排序
     4     for(int i = 1 ;i < length;i++)
     5     {
     6         //和当前已排序好的数组部分作比较,如果小于则交换
     7         for(int j = i;j > 0 ;j--)
     8         {
     9             if(x[j] < x[j - 1])
    10             {
    11                 int temp = x[j];
    12                 x[j] = x[j - 1];
    13                 x[j - 1] = temp;
    14             }
    15         }
    16     }    
    17 }

    冒泡排序:每次从数组的最后一个元素开始向前遍历,起时间复杂度同上,但是由于冒泡排序的特性(在从最后一个元素冒前面泡的同时,相对后面较小的元素也冒了上来),它的常数因子较小:

     1 void BubbleSort(int * x,int length)
     2 {
     3     //如果你数组是逆序排列,外层需要n次才能让数组顺序排列
     4     for(int i = 0 ; i < length;i++)
     5     {
     6         //每次选择数组的最后一个元素,如果前一个大于当前元素(也就是"泡"),两者交换,也就是较小元素冒了上来
     7         //否则,索引前移,继续遍历
     8         for(int j = length - 1;j > 0 j++)
     9         {
    10             if(x[j] < x[j - 1])
    11             {
    12                 int temp = x[j];
    13                 x[j] = x[j - 1];
    14                 x[j - 1] = temp;
    15             }
    16         }
    17     }
    18 }

    这三种排序算法是非常简单的,而且在实际应用中也基本不用,但是通过对它们的理解,可以感受到算法设计的魅力所在。

  • 相关阅读:
    babel-loader的原理
    js弱类型转换的知识点
    个人说明
    嗯三月的小计划
    bzoj2326 [HNOI2011]数学作业
    bzoj2654 tree
    bzoj1018[SHOI2008]堵塞的交通traffic
    bzoj1937[Shoi2004]Mst 最小生成树
    一般图最大匹配-带花树-带注释模板
    FFT快速傅里叶变换-递归版-带注释模板
  • 原文地址:https://www.cnblogs.com/baikequanshu/p/3422353.html
Copyright © 2011-2022 走看看