排序演算法 一 直接插入排序和希爾排序

2021-07-24 17:00:34 字數 1283 閱讀 3139

(1)直接插入排序

直接插入排序

是一種簡單粗暴的排序演算法,即每一步都把乙個待排資料按其大小插入到乙個已排好序的序列當中,  直到整個序列都排為有序為止。

例如:要以公升序排下面這個序列:

直接插入排序演算法的的最好情況就是當序列已經有序的時候,這時候只需要進行n-1次比較就行,也不用進行任何的資料移動,這時的時間複雜度是o(n);但最壞的情況下是逆序的時候,此時所有資料都要移動,時間複雜度為o(n^2)非常的低效。因此,插入排序是不適合於資料量特別大的序列排序的。

下面我在再講另一種排序演算法:

(2)希爾排序

希爾排序也是一種插入排序,是直接插入排序演算法的優化。採用了分治的思想將一整個序列分成幾個組,再對每個組進行排序,盡可能的讓較大的資料往序列的的後邊移,讓較小的資料往序列的前邊移。

這裡用乙個變數gap來記錄乙個兩個分組之間的距離,也可以叫做增量,希爾排序就是通過縮小這個增量進行排序來提高效率的,這一步也叫做

預排序:

假如還是對上面提到的陣列序列進行排序,則排序結果如下:

這裡最重要的就是確定gap的值啦!在我的**中gap=gap/3+1(gap初始為陣列元素個數),因此,第一趟排序中,gap=4;第二趟排序中gap=2;最後一趟排序中gap=3,相當於直接插入排序,但此時整個陣列基本接近有序,所以直接插入排序效率還是挺高的。

希爾排序演算法就是通過預排序避免了直接插入排序演算法中效率較低的情況,再進行直接插入排序,達到了一定的優化效果。

下面給出我自己實現這兩種排序演算法的**:

void insertsort(int *arr,size_t size)

arr[pos + 1] = tmp;

}}void shellsort(int *arr,size_t size)

arr[pos + gap] = tmp;

} }}



排序演算法(一) 直接插入排序和希爾排序

將乙個待排的資料插入到已經排序過的資料中去,並且資料依然保持有序。1.取出待比較資料5 2.比8小,將8後移一位 3.比6小,將6後移一位 4.比4大,資料放入陣列 插入temp a j factor temp return a 先將n個資料分為x x n 2 組,每組元素進行直接插入排序,再將其分...

排序 一 直接插入排序

1 直接插入排序 1 定義 直接插入排序 straight insertion sort 是一種最簡單的排序方法。它的基本操作是將乙個記錄插入到乙個長度為m 假設 的有序表中,使之仍保持有序,從而得到乙個新的長度為m 1 的有序表。2 演算法思路 設有一組關鍵字 k 1 k 2 k n 排序開始就認...

排序一 直接插入排序

基本思想 當插入第i i 1 個物件時,前面的i 1 項 元素已經排序完成,這時 用 第 i 項 和 前面的 i 1 項進行比較,然後把插入的位置後面的元素後移一位 再 插入該位置。實現一趟排序的步驟 找位置 移位 插入資料 實現 void insertsort int arr size t siz...