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

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

①直接插入排序

基本思想:当插入第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 & arr)
{
    //升序
    int n = arr.size();
    int temp=0;int j=0;
    for(int i=1;i=0;j--)
        {
            if(temp
②折半插入排序

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

代码:

void BinaryInsertionSort(vector & arr)
{
    //升序
    int n = arr.size();int temp=0;
    int low=0,high=0,middle=0;
    for(int i=1;i=low;k--)arr[k+1]=arr[k];
        arr[low]=temp;
    }

}
③希尔排序(缩小增量排序)
基本思想:设待排序元素序列有n个元素,首先取一个整数gap

代码:

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









你可能感兴趣的:(数据结构,插入排序,数据结构)