冒泡排序和希尔排序
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);
结果
以上是关于冒泡排序和希尔排序的主要内容,如果未能解决你的问题,请参考以下文章
插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析