zoukankan      html  css  js  c++  java
  • [C语言] 选择排序之鸡尾酒排序的特性及实现

    C语言] 选择排序之鸡尾酒排序的特性及实现

     

    1、算法特性

      鸡尾酒排序又称定向冒泡排序法,是一种稳定的选择排序方法,排序效果稍优于冒泡排序。

      其时间复杂度最好情况为O(n)、最差与平均情况为O(n²),空间复杂度为O(1)。

     

    2、算法思路:

      以升序排列为例,先设置两个临时变量index_nmin与index_nmax分别存储最小值与最大值的下标,初始一般假设index_nmin与index_nmax均为0,再将选定值与其之后的数据依次比较:当比较值比选择值小/大时,index_nmin/index_nmax更新为比较值的下标,之后继续检索,直到无序序列部分结束为止;一轮检索过后将arr[index_nmin]与无序序列队首、arr[index_nmax]与无序序列队尾交换位置,经过len/2次循环便可以将所有数据排列有序。

      这里需要注意的是,在最小/最大值与相应位置交换之后需要多一道核实流程:在最小/最大值交换完毕后,检查最大/最小值的下标是否是i-1/len-i,若是,则要将最大/最小值与下标i-1/len-i交换;若不是,则继续正常交换。其目的是避免最大最小值最终位置错乱。

       

     

    3、实现代码

     1 #include <stdio.h>
     2 
     3 // 鸡尾酒排序:选择排序一种变化形式
     4 void cooktail_sort(int arr[],int len)
     5 {
     6     for(int i=1; i<=len/2; i++)
     7     {
     8         int max = i-1;
     9         int min = i-1;
    10         for(int j=i; j<=len-i; j++)
    11         {
    12             if(arr[j] > arr[max])
    13             {
    14                 max = j;
    15             }
    16             if(arr[j] < arr[min])
    17             {
    18                 min = j;    
    19             }
    20         }
    21         if(max != len-i)
    22         {
    23             int tmp = arr[len-i];
    24             arr[len-i] = arr[max];
    25             arr[max] = tmp;
    26         }
    27         if(min == len-i) // 最小值的位置正好在本来应该存储最大值位置 经过上面交换之后最小值放到了max位置上
    28         {
    29             int tmp = arr[i-1];
    30             arr[i-1] = arr[max];
    31             arr[max] = tmp;
    32         }
    33         else if(min != i-1)
    34         {
    35             int tmp = arr[i-1];
    36             arr[i-1] = arr[min];
    37             arr[min] = tmp;
    38         }
    39     }    
    40 }
    41 
    42 void travel(int arr[],int len)
    43 {
    44     for(int i=0;i<len;i++)
    45     {
    46         printf("%d ",arr[i]);    
    47     }    
    48     printf("
    ");
    49 }
    50 
    51 int main()
    52 {
    53     int arr[] = {53,82,9,233,43,14,55,9,4,67};
    54     int len = sizeof(arr)/sizeof(arr[0]);
    55 
    56     travel(arr,len);
    57     select_sort(arr,len);
    58     travel(arr,len);
    59 
    60 /*  travel(arr,len);
    61     cooktail_sort(arr,len);
    62     travel(arr,len);*/
    63 
    64     return 0;
    65 }

     

    4、测试结果

  • 相关阅读:
    python自动化测试-使用第三方python库技术实现
    JMeter目录结构
    JMeter Http请求之content-type用法
    JMeter生成性能报表-Windows环境和Linux环境
    JMeter4.0 IF Controller
    c++ 初始化列表和构造函数初始化区别
    关于C++ 中 thread 的拷贝构造函数
    函数的参数类型 指针和指针的引用的区别
    window10 vs2013 SIFTGPU
    Qt使用双缓冲绘图时报错:pure virtual method called
  • 原文地址:https://www.cnblogs.com/usingnamespace-caoliu/p/9428134.html
Copyright © 2011-2022 走看看