6种排序算法总结

整理一下各种排序算法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
class Sort{
public:
//冒泡排序,O(N*N)
void bubbo_sort(vector<int>& arr){
for(int i=0;i<arr.size()-1;i++){
for(int j=arr.size()-1;j>i;j--){
if(arr[j]<arr[j-1]) swap(arr[j],arr[j-1]);
}
}
}
//直接插入排序,O(N*N)
void insert_sort(vector<int> &arr){
for(int i = 1;i < arr.size();i++){
int key = arr[i];
int j = i;
while(j>0&&arr[j-1]>key){
arr[j] = arr[j-1];
j--;
}
arr[j] = key;
}
}
//选择排序,O(N*N)
void select_sort(vector<int> &arr){
for(int i=0;i<arr.size();i++){
int minVal = arr[i];
int minPos = i;
for(int j=i+1;j<arr.size();j++){
if(minVal>arr[j]){
minVal = arr[j];
minPos = j;
}
}
swap(arr[i],arr[minPos]);
}
}
//快速排序,O(N*LogN)
void quick_sort(vector<int> & arr,int l,int r){
if(l>=r) return ;
int i = l,j = r,key = arr[l];
while(i<j){
while(i < j && arr[j] > key) j--;
if(i < j) arr[i++] = arr[j];
while(i < j && arr[i] < key) i++;
if(i < j) arr[j--] = arr[i];
}
arr[i] = key;
quick_sort(arr,l,i-1);
quick_sort(arr,i+1,r);
}
//归并排序,O(N*LogN)
void merge_sort(vector<int> &arr,int l,int r){
vector<int> tmp(r-l+1);
if(l>=r) return ;
int mid = (l+r) / 2;
merge_sort(arr,l,mid);
merge_sort(arr,mid+1,r);
int i = l,j = mid+1;
int k = 0;
while(i<=mid&&j<=r){
if(arr[i]<arr[j])
tmp[k++] = arr[i++];
else
tmp[k++] = arr[j++];
}
while(i<=mid){
tmp[k++] = arr[i++];
}
while(j<=r){
tmp[k++] = arr[j++];
}
for(int i=0;i<=r-l;i++){
arr[l+i] = tmp[i];
}
}

void shiftDown(vector<int>& arr,int index,int heapSize){
int key = arr[index];
int father = index,child;
while((child=father*2+1)<heapSize){
if(child+1<heapSize && arr[child] < arr[child+1]) child++;
if(key > arr[child]) break;
arr[father] = arr[child];
father = child;
}
arr[father] = key;
}
//堆排序,O(N*LogN)
void heap_sort(vector<int> &arr){
//construct max heap
for(int i=arr.size()/2-1;i>=0;i--){
shiftDown(arr,i,arr.size());
}
// for(int i=0;i<arr.size();i++){
// cout<<arr[i]<<" ";
// }
// cout<<endl;
for(int i=arr.size()-1;i>=0;i--){
swap(arr[0],arr[i]);
shiftDown(arr,0,i);
}
}
};