三种插入排序及其C++实现

来源:互联网 发布:上海行知小学 编辑:程序博客网 时间:2024/06/03 20:16

插入排序的基本方法是:每步将一个待排序的元素按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。

①直接插入排序

基本思想:当插入第i个元素时,前面的0~i-1个元素已经排好序,将第i个元素与前面元素依次比较,直至找到适合它的位置,插入并且其后的元素依次后移。

例子:    10 3 9 22 15 6 

第一次排序: 3 10 9 22 15 6

第二次排序: 3 9 10 22 15 6

第三次排序: 3 9 10 15 22 6

第四次排序: 3 6 9 10 15 22


第四次排序的过程:

  temp

 3 9 10 15 22 6    -

 3 9 10 15 22 22  6

 3 9 10 15 15 22  6

 3 9 10 10 15 22  6

 3 9 9 10 15 22    6

 3 6 9 10 15 22    6

每次将要插入的元素存到temp中,防止元素后移覆盖掉它,以升序为例,如果temp<前面元素,那么该元素后移,直至找到比temp小的元素,插入。 时间复杂度O(n²),排序结果稳定。

代码实现:

void InsertionSort (vector<int> & arr){    //升序    int n = arr.size();    int temp=0;int j=0;    for(int i=1;i<n;i++)    {        temp = arr[i];        for( j=i-1;j>=0;j--)        {            if(temp<arr[j])                {                    arr[j+1]=arr[j];                }                else                {                    break;                }        }        arr[j+1]=temp;    }}
②折半插入排序

折半插入排序是在直接插入排序的基础上的改良版,区别在于查找待插入元素的位置时采用二分查找,平均效率要高一些。时间复杂度O(n²),排序结果稳定。

代码:

void BinaryInsertionSort(vector<int> & arr){    //升序    int n = arr.size();int temp=0;    int low=0,high=0,middle=0;    for(int i=1;i<n;i++)    {        temp = arr[i];        low=0;        high=i-1;        while(low<=high)        {            middle = (low+high)/2;            if(temp<=arr[middle])                    high=middle-1;                else                    low=middle+1;        }        for(int k=i-1;k>=low;k--)arr[k+1]=arr[k];        arr[low]=temp;    }}
③希尔排序(缩小增量排序)
基本思想:设待排序元素序列有n个元素,首先取一个整数gap<n作为间隔,将全部元素分为gap个子序列,所有距离为gap的元素放到同一个子序列中,在每一个子序列中分别施行直接插入排序。然后缩小gap,例如取gap=[gap/2],重复上述的子序列划分和排序工作。直到最后gap=1。希尔排序的时间复杂度很难确定,至今无人能够明确给出,同时它是一种结果不稳定的排序方法。

代码:

void ShellSort(vector<int> & arr){    //升序    int n = arr.size();int temp=0;int j;    int gap = n-1;    do    {        gap=gap/3+1;        for(int i=gap;i<n;i++)        {            if(arr[i]<arr[i-gap])            {                temp=arr[i];                j=i-gap;                do{                    arr[j+gap]=arr[j];                    j=j-gap;                }                while(j>=0&&temp<arr[j]);                arr[j+gap]=temp;            }        }    }    while(gap>1);}









原创粉丝点击