冒泡排序和希尔排序

Posted 勇士后卫头盔哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序和希尔排序相关的知识,希望对你有一定的参考价值。

冒泡排序

基本思想
每次从后向前进行(假设为第i次),j=n-1,n-2,…,i,两两比较V[j-1]和V[j]的关键字,如果发生逆序则交换V[j-1]和V[j]的值,如下图所示从无序序列区域最后一个元素开始冒泡,若发现逆序则交换元素,一次冒泡过后有序序列区域增加一个元素且仍有序

下图是动画演示过程,Exchang用来标记无序序列是否已经有序,若已经有序则Exchang置为0避免再次冒泡比较浪费时间,时间复杂度为O(n*n)且是稳定排序


代码演示

 template <typename T>
        static void Bubble(T array[],int len,bool min2max = true)
        
           bool  exchange = true;//设置标记
           for(int j = 0;j<len-1&&exchange;j++)//外层循环用来标记无序区域需要进行几次冒泡过程,如上图需要4次
           
                exchange = false;//若无交换则设置为flase,表示无需再交换
                for(int i=len-1;i>j;i--)//内层循环用来进行无序区域的冒泡
                
                    if(min2max?array[i]<array[i-1]:array[i]>array[i-1])//若大于或者小于则交换元素
                    
                        swap(array[i],array[i-1]);
                        exchange = true;
                    
                
           
        

结果

希尔排序


基本思想
将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序,然后再对整个序列进行插入排序,例如:将n个数据元素分成d个子序列,其中,d称为增量,它的值在排序过程中从大到小逐渐缩小,值到最后一趟排序减为1
动图演示
可以看出希尔排序是不稳定的排序,其时间复杂度为O(n的3/2次方)
第一次以3为增量选择出3个子序列,然后三个子序列分别在其位置进行插入排序

第二次以2为增量选择出2个子序列,然后二个子序列分别在其位置进行插入排序

第三次以1为增量选择出1个子序列,然后其子序列分别在其位置进行插入排序

代码演示

template <typename T>
static void Shell(T array[],int len,bool min2max = true)

       int d = len;
       do
       
          d = d/3 + 1;//定义d增值的数值
          for(int i = d;i<len;i+=d)//循环不同子序列的插入排序
          
              int  k = i;
              T  e = array[i];
              /*
               * 插入排序过程
              */
             for(int j=i-d;j>=0;j-=d)
              
                  if(min2max?array[j]<e:array[j]>e)
                  
                      array[j+d] = array[j];
                      k = j;
                  
                  else
                  
                     break;
                  
              
              if(k!=i)
              array[k] = e;
         
       while(d>1);

结果

以上是关于冒泡排序和希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

数据结构开发(17):冒泡排序和希尔排序

冒泡排序和希尔排序

排序算法

插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析

算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序

搜索与排序—— 冒泡排序选择排序插入排序与希尔排序