一、插入排序
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.空間占用 ...