插入:
直接插入。前有序後無序,有序依此插無序。
交換:直接交換。前有序後無序,無序min 入有序。
冒泡交換。前無序後有序。無序max 入有序。
快排。設標兵,挖坑,填坑。使左邊都比標兵小,右邊都比標兵大。
歸併:翻倍每次排序量,初始為2。
shell:縮小增量。初始增量n/
2。堆排序:取前n,建大根堆,交換根與葉子最右。取前n-
1再建堆。
直插,冒泡,歸併穩定。
堆,歸併,快排,nlogn。
//插入排序 遍歷無序序列,將無序元素插入有序序列中
void
insert_sort
(vector<
int> a)
// a[1] = a[0];
// 此時 j = -1;
a[++j]
= tmp;
}for
(auto i:a)
cout << i <<
",";
}
// 選擇排序 遍歷a[1]-a[n] 交換,使a[0]為min
// 每次選最小的 5 8 5 2 9 2和5交換 前5 變 後5 不穩定
void
choose_sort
(vector<
int> a)}}
for(
auto i:a)
}
// 冒泡 穩定 交換相鄰兩數, 使max在最後
// 每一躺,在前面的無序中 冒乙個max到最後
void
bubbling_sort
(vector<
int> a)}}
for(
auto i:a)
cout <
}
#include
using
namespace std;
void
quick_sort
(int a,
int l,
int r)
a[hole]
= a[right]
; hole = right;
//坑的位置
while
(a[left]
< tmp && left
a[hole]
= a[left]
; hole = left;
//坑的位置
}//此時left == right == hole 填坑
a[hole]
= tmp;
if(l < hole-1)
if(hole+
1< r)
}int
main()
;quick_sort
(a,0,9
);for(
int i=
0; i<
10; i++
)return0;
}
//歸併排序
//初始狀態:6,202,100,301,38,8,1
//第一次歸併後:,,,,比較次數:3;
//第二次歸併後:,,比較次數:4;
//第三次歸併後:,比較次數:4;
//總的比較次數為:3+4+4=11;
void
merge
(int sourcearr,
int temparr,
int startindex,
int midindex,
int endindex)
while
(i != midindex+1)
temparr[k++
]= sourcearr[i++];
while
(j != endindex+1)
temparr[k++
]= sourcearr[j++];
for(i=startindex; i<=endindex; i++
) sourcearr[i]
= temparr[i];}
//內部使用遞迴
void
mergesort
(int sourcearr,
int temparr,
int startindex,
int endindex)
}
//希爾排序 縮小增量排序
// 增量:: 相隔較遠兩數的距離
// 增量: sum = 10 5,2,1 sum = 11 5,2,1 tag
void
shell_sort
(int a,
int len)
// else
// }
for(
int j=i-gap; j>=
0&& a[j]
>a[j+gap]
; j=j-gap)}}
for(
int i=
0;i)}
shell排序如下圖 當a[j]>a[j+gap] //3<9 3之前gap為2的數必然是遞增的,不必再執行最裡層的for迴圈
//堆排序
//建堆
// 假設已經有了n個資料,那麼新資料自然放在n位(因為位置是從0開始)
// 將新資料與 (n-1)/2 位置的資料(新資料的父節點)比較,如果比父節點大,那麼就交換,繼續比較,直到它比父節點小。 就插入完成
// 依此插入 完成建堆
void
make_heap_c
(int a,
int len)}}
}void
heap_sort_c
(int a,
int size)
for(
int i=
0; i
)}
void
heap_sort
(vector<
int>
& a)
for(
auto tmp:a)
cout << tmp << endl;
}
常用排序演算法
筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。一 為什麼要研究排序問題 許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點 l有時候應用程式本身需要對資訊進行排序,如為了準備客戶賬目,銀行需要對支票賬號進行排序 l很多演算法將排序作為...
常用排序演算法
一 簡單排序演算法 由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所...
常用排序演算法
排序演算法 最好時間 平均時間 最壞時間 輔助空間 穩定性 直接插入排序 o n o n 2 o n 2 o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 直接選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 堆排序 o n x lbn o n x lbn o n x lbn o ...