資料結構1 排序

2022-04-03 02:12:23 字數 2716 閱讀 4833

關鍵字相同的項排序後順序不變就是穩定的排序演算法,否則是不穩定的排序演算法。

排序分為內部排序和外部排序,內部排序只需要訪問記憶體,外部排序還需要訪問外存。

1.氣泡排序(穩定排序演算法)

很經典簡單的方法,每個數字從最下面開始一層一層往上走,像冒泡泡一樣。

冒泡是用兩個巢狀的for迴圈實現的,基本操作(比較兩個數的大小)的執行次數最差是n(n-1)/2,最好的情況下的是有序的,則執行次數是n。

因此,氣泡排序演算法的時間複雜度:最差,平均:o(n2),最好:o(n)

空間複雜度:1(原地工作)   只需要交換值,不需要額外的空間

時間複雜度是乙個量級的概念,有點類似於高數里的極限的概念,因此n(n-1)/2可以看成n平方的複雜度。

2.快速排序(不穩定排序演算法)

2.1方法:快排是建立在遞迴的基礎上的排序演算法,基本思想就是將乙個序列分為兩部分,再分別給兩部分內部排序。

2.2 特點:快排演算法的特點是不用交換,直接取代,而且二分法的遞迴策略很大提高了快排的效率。

2.3 時間複雜度(這個我不會推導)    最好、平均:o(n log(n))       最差:o(n2)

2.4 空間複雜度:o(log(n))

3.堆排序

3.1 方法 堆排序分為兩步,第一步是將乙個序列構建成堆,第二步是依次從堆頂去除最大(小)元素,然後重新將剩下的元素構建成堆

3.2 特點 堆排序最大的特點就是時間複雜度穩定,對於資料量大的工作很適合。

3.3 時間複雜度:最差、平均、最好都是:o(n log(n))   

3.4 空間複雜度:1(原地工作)

快排是對冒泡的改進,是將冒泡用了分治遞迴的策略講乙個大問題分解成若干個不相干的子問題。而堆排序是動態規劃,將乙個問題分解成很多個互相相關的子問題。因此堆排序更加穩定。

4.歸併排序

4.1 方法 歸併排序是很典型的利用遞迴分治策略做排序的演算法,他把乙個序列分為兩部分,先給兩部分排序然後合併。再把兩部分的小序列分開分別排序在合併。這樣遞迴操作一直到只需要排序兩個數。

4.2 特點 歸併排序是乙個穩定的排序演算法,但是比較複雜

4.3 時間複雜度:最差、平均、最好都是:o(n log(n))   

3.4 空間複雜度:o(n)

1 #include 2 #include3

using

namespace

std;4//

交換兩個數

5void swaptwo(int& var1,int&var2)611

//公升序冒泡---by myself

12/*

13void bubblesort(vector& vec)

1424}25

}26}*/

27//

公升序冒泡---standard

28void bubblesort(vector&vec)

2938}39

}40int partition(vector &vec,int low,int high)//

輸出序列的第乙個數字的正確排序的座標

4150 vec[low]=pivotkey;

51return

low;52}

53void qsort(vector &vec,int low,int high)//

給序列分為兩部分並遞迴每一部分排序

5461}62

void quicksort(vector &vec)

6368

void heapadjust(vector &vec,int low,int high)//

堆排序的向下篩選,構建乙個大頂堆

6980 vec[low]=temp;81}

82void heapsort(vector &vec)

8393}94

void merge(vector &vec,vector sorted,int start,int mid,int end)//

將vec以mid為分界點的兩個序列合併成乙個有序序列

95105

106}

107while(i<=mid)//

最後面的大數字再插到後面

108111

while(j<=end)

112115 k=start;

116while(start<=end)//

將sort中排序好的結果再傳給vec,即可將vec排序

117 vec[start++]=sorted[k++];

118}

119void msort(vector &vec,vector sorted,int start,int end)//

分開成小序列,再合併

120128

}129

void mergesort(vector &vec)

130135

intmain() ;

141/*

142do//單行資料輸入

143while(cin.get() != '\n');

147*/

148//

bubblesort(vec);

149//

quicksort(vec);

150//

heapsort(vec);

151mergesort(vec);

152for(auto &w:vec)

153156

return0;

157 }

資料結構1 排序

就算複習再緊張,也要動手實踐資料結構中的基本演算法,徹底理解演算法的本質。不要讓任何理由成為不程式設計的藉口。從快速排序開始,將演算法問題一一攻克。複習提綱 基本資料結構 棧和佇列,陣列和鍊錶 樹和二叉樹 二叉查詢樹 平衡二叉樹 雜湊表 排序演算法 選擇排序 氣泡排序和快速排序 堆和堆排序 計數排序...

資料結構 07 排序

簡單的排序方法 氣泡排序 選擇排序 插入排序 希爾排序。先進的排序方法 歸併排序 快速排序 堆排序 基數排序。1.演算法思想 每次在未排序的元素中兩兩比較找最大值,邊找邊從後往前儲存 未排序.第i大 第2大 第1大 一般情況,整個氣泡排序只需進行 k 1 k氣泡排序結束的條件是 在某一趟排序過程中沒...

資料結構7 排序

理解選擇排序的不穩定性 選擇排序 氣泡排序 插入排序 public int charusort int intarr for int i 1 i intarr.length i return intarr 正確性檢測 test public void sorttest system.out.prin...