數據結構-插入排序&希爾排序

一、插入排序


<1>介紹:插入排序(Insertion Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反覆把已排序元素逐步向後挪位,爲最新元素提供插入空間。

<2>思路:
從第一個元素依次進行以下操作:對於當前元素可以認爲當前元素之前的部分已經有序;取出當前位置的下一個元素作爲要排序的值,在已經排序的元素序列中從後向前掃描,如果該元素(已排序)大於新元素,將該元素移到下一位置;直到找到已排序的元素小於或者等於新元素的位置,將新元素插入到該位置中;
分別把下標從0到數組元素個數-1的元素作爲end,進行以上操作;每次循環的目的就是爲了將當前tmp值放置在之前序列中該放的位置上,使得當前部分序列有序。

<3>優缺點:
假如現在需要將12345進行升序插入排序,按照插入排序的特性時間複雜度爲O(N),所以插入排序針對於接近有序的序列時間複雜度較低;但是若將12345進行降序排,那麼時間複雜度就會變爲O(N^2);所以有了接下來的希爾排序。總之:對於接近有序的序列進行插入排序效率較優,對於無序的平均時間複雜度就會提升到O(N^2)。

<4>實現:
void InsertSort(int* arr, int sz)
{
    for (int i = 0; i < sz - 1; i++)
    {
        int end = i;
        int tmp = arr[end + 1];

        while (end >= 0)
        {
            if (arr[end] > tmp)
            {
                arr[end + 1] = arr[end];
                end--;
            }
            else
                break;
        }
        arr[end + 1] = tmp;
    }
}

<4>圖示過程:

這裏寫圖片描述


二、希爾排序


<1>介紹:希爾排序,也稱遞減增量排序算法,是插入排序的一種高速而穩定的改進版本,先將序列進行預排序再不斷縮小間隔,當間隔爲1時即爲插入排序。
希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
1、插入排序在對幾乎已經排好序的數據操作時, 效率高, 即可以達到線性排序的效率;
2、但插入排序一般來說是低效的, 因爲插入排序每次只能將數據移動一位。

<2>思路及排序效果:
①:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序;
②:然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。

大致思路和插入排序相同,區別在於希爾排序可以給定一個gap值,也就是間隔,可以預先先將間隔gap的序列對應有序,再不斷縮小gap值,到最後一趟依次比較。
這裏寫圖片描述


<3>實現:
void ShellSort(int* arr, int sz)
{
    int gap = 3;
    while (gap > 1)
    {
        gap = gap / 3 + 1;
        for (int i = 0; i < sz - gap; i++)
        {
            int end = i;
            int tmp = arr[end + gap];
            while (end >= 0)
            {
                if (tmp < arr[end])
                {
                    arr[end + gap] = arr[end];
                    end -= gap;
                }
                else
                    break;
            }
            arr[end + gap] = tmp;
        }
    }

<4>圖示過程:

這裏寫圖片描述

發佈了55 篇原創文章 · 獲贊 192 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章