基本排序演算法小結

2021-09-08 16:44:43 字數 1687 閱讀 1871

一、插入排序

1  排序思想

將待排序的記錄ri,插入到已排好序的記錄表r1, r2 ,…., ri-1中,得到乙個新的、記錄數增加1的有序表。 直到所有的記錄都插入完為止。複雜度為o(n2) 。

設待排序的記錄順序存放在陣列r[1…n]中,在排序的某一時刻,將記錄序列分成兩部分:

◆ r[1…i-1]:已排好序的有序部分;

◆ r[i…n]:未排好序的無序部分。

顯然,在剛開始排序時,r[1]是已經排好序的。

例:設有關鍵字序列為:7, 4, -2, 19, 13, 6,直接插入排序的過程如下圖所示:

**如下:

//直接插入排序

void straight_insert_sort(int *l,intlength)}}

}

在最壞情況和平均情況下,氣泡排序執行大約n*n/2次比較操作和n*n/2次交換操作。

五、快速排序

快速排序演算法是一種分治排序演算法,它將陣列劃分為兩部分,然後分別對這兩部分進行排序。它將重排序陣列,使之滿足一下三個條件:

1,對於某個i,a[i]在最終的位置上

2,a[l]…a[i-1]中的元素都比a[i]小

3,a[i+1] …a[r]中的元素都比a[i]大

通過劃分後完成本輪排序,然後遞迴地處理子檔案。

如果陣列中有乙個或者0個元素,就什麼都不做。否則,呼叫以下演算法實現快速排序:

int partition(itema,int l,int r)

while (less(v,a[--j]))

}if (i>=j)

exch(a[i],a[j]);

}exch(a[i],a[r]);

return i;

}

變數v儲存了劃分元素a[r],i和j分別是左掃瞄指標和右掃瞄指標。劃分迴圈使得i增加j減小,while迴圈保持乙個不變的性質---------i左側沒有元素比v大,j右側沒有元素比v小。一旦兩個指標相遇,我們就交換啊a[i]和a[r],,這樣v左側的元素都小於v,v右側的元素都大於等於v,結束劃分過程。

劃分是乙個不確定的過程,當兩個指標相遇,就通過break語句結束。測試j==1用來防止劃分元素是檔案總的最小元素。

voidquichsort(item a,int l,int r)

i=partition(a,l,r);

quichsort(a,l,i-1);

quichsort(a,i+1,r);

}

注:快速排序是乙個遞迴劃分過程,我們對乙個檔案進行劃分,劃分原則是將一些元素放在它最終的位置上,對陣列進行排序使比劃分元素小的元素都在劃分元素的左邊,比劃分元素大的元素都在劃分元素的右邊,然後分別對左右兩部分進行遞迴處理。然後,從陣列的左端進行掃瞄,直到找到乙個大於劃分元素的元素,同時從資料的右端開始掃瞄,直到找到乙個小於劃分元素的元素。使掃瞄停止的這個兩個元素,顯然在最終的劃分陣列中的位置相反,於是交換二者。繼續這一過程,我們就可以保證比劃分元素小的元素都在劃分元素的左邊,比劃分元素大的元素都在劃分元素的右邊。

基本排序演算法小結

根據排序時選擇的策略可以分為 插入排序 直接插入排序 其他插入排序 折半插入排序 2 路插入排序 表插入排序 交換排序 氣泡排序 快速排序 選擇排序 簡單選擇排序 堆排序 歸併排序 基數排序 總結 1 時間複雜度為o n2 的排序都是穩定的,且其空間複雜度為o 1 2 先進的排序有 希爾排序 快速排...

排序演算法小結

1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...

排序演算法小結

1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...