十大排序算法实在是太过于经典了,因此,这篇博客将对十大排序算法进行总结,以C++实现为主。
快速排序 平均时间复杂度为:O(nlogn);空间复杂度为O(nlogn)。 不稳定排序。n大的时候,性能更加优越。
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 #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> using namespace std ;int partition (vector <int > & vec,int start,int end) { int point=vec[start]; int i=start; int j=end; while (i<j){ while (i<j && vec[j]>=point) j--; vec[i]=vec[j]; while (i<j && vec[i]<point) i++; vec[j]=vec[i]; } vec[i]=point; return i; } void quick_sort (vector <int > &vec,int start,int end) { if (start>end) return ; int j=partition(vec,start,end); quick_sort(vec,start,j-1 ); quick_sort(vec,j+1 ,end); } int main () { int n; scanf ("%d" ,&n); vector <int > vec; for (int i=0 ;i<n;i++){ int x; scanf ("%d" ,&x); vec.push_back(x); } quick_sort(vec,0 ,n-1 ); for (int i=0 ;i<n;i++){ printf ("%d " ,vec[i]); } return 0 ; }
冒泡排序 平均时间复杂度为:O(n\^2);空间复杂度为O(1)。 稳定排序。
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 #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> #include <iostream> using namespace std ;void bubble_sort (vector <int > &vec) { int size=vec.size(); for (int i=0 ;i<size-1 ;i++){ for (int j=0 ;j<size-i-1 ;j++){ if (vec[j]>vec[j+1 ]) swap(vec[j],vec[j+1 ]); } } } int main () { int n; scanf ("%d" ,&n); vector <int > vec; for (int i=0 ;i<n;i++){ int x; scanf ("%d" ,&x); vec.push_back(x); } bubble_sort(vec); for (int i=0 ;i<n;i++){ cout <<vec[i]<<" " ; } return 0 ; }
归并排序 平均时间复杂度为:O(nlogn);空间复杂度为O(nlogn)。 稳定排序。n大的时候,性能更加优越。
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 #include <stdio.h> #include <string.h> #include <math.h> #include <vector> using namespace std ;void merge (vector <int > & vec,int low,int mid,int high) { vector <int > temp (high-low+1 ,0 ) ; int left_low=low; int left_high=mid; int right_low=mid+1 ; int right_high=high; int i=0 ; for (i=0 ;left_low<=left_high && right_low<=right_high;i++){ if (vec[left_low]<=vec[right_low]){ temp[i]=vec[left_low]; left_low++; } else { temp[i]=vec[right_low]; right_low++; } } if (left_low<=left_high){ while (left_low<=left_high){ temp[i]=vec[left_low]; i++; left_low++; } } if (right_low<=right_high){ while (right_low<=right_high){ temp[i]=vec[right_low]; i++; right_low++; } } for (int j=0 ;j<(high-low+1 );j++){ vec[low+j]=temp[j]; } return ; } void merge_sort (vector <int > &vec,int start,int end) { if (start>=end) return ; int mid=start+(end-start)/2 ; merge_sort(vec,start,mid); merge_sort(vec,mid+1 ,end); merge(vec,start,mid,end); return ; } int main () { int n; scanf ("%d" ,&n); vector <int > vec; for (int i=0 ;i<n;i++){ int x; scanf ("%d" ,&x); vec.push_back(x); } merge_sort(vec,0 ,n-1 ); for (int i=0 ;i<n;i++){ printf ("%d " ,vec[i]); } return 0 ; }
堆排序 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 #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> using namespace std ;void adjust_heap (vector <int > &vec,int size,int index) { int left=2 *index+1 ; int right=2 *index+2 ; int max_index=index; if (left<size && vec[left]>vec[max_index]) max_index=left; if (right<size && vec[right]>vec[max_index]) max_index=right; if (max_index!=index){ swap(vec[max_index],vec[index]); adjust_heap(vec,size,max_index); } } void heap_sort (vector <int > &vec,int size) { for (int i=size/2 -1 ;i>=0 ;i--){ adjust_heap(vec,size,i); } for (int i=size-1 ;i>=1 ;i--){ swap(vec[0 ],vec[i]); adjust_heap(vec,i,0 ); } } int main () { int n; scanf ("%d" ,&n); vector <int > vec; for (int i=0 ;i<n;i++){ int x; scanf ("%d" ,&x); vec.push_back(x); } heap_sort(vec,vec.size()); for (int i=0 ;i<n;i++){ printf ("%d " ,vec[i]); } return 0 ; }
计数排序 平均时间复杂度为:O(n+k);空间复杂度为O(n+k)。 稳定排序,其中,k表示序列中最大值。所以,计数排序使用与最大值不是很大的序列。
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 #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> using namespace std ;void count_sort (vector <int > & vec) { if (vec.size()==0 ) return ; int maxvalue=0 ,minvalue=0 ; for (int i=0 ;i<vec.size();i++){ maxvalue=max(maxvalue,vec[i]); minvalue=min(minvalue,vec[i]); } int range=maxvalue-minvalue+1 ; vector <int > temp (range,0 ) ; for (int i=0 ;i<vec.size();i++){ temp[vec[i]-minvalue]+=1 ; } int j=0 ; for (int i=0 ;i<range;i++){ while (temp[i]!=0 ){ vec[j]=i+minvalue; temp[i]--; j++; } } } int main () { int n; scanf ("%d" ,&n); vector <int > vec; for (int i=0 ;i<n;i++){ int x; scanf ("%d" ,&x); vec.push_back(x); } count_sort(vec); for (int i=0 ;i<n;i++){ printf ("%d " ,vec[i]); } return 0 ; }
选择排序 平均时间复杂度为:O(n^2);空间复杂度为O(1)。 不稳定排序。
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 #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> using namespace std ;void select_sort (vector <int > &vec) { int i=0 ; for (i=0 ;i<vec.size()-1 ;i++){ for (int j=i+1 ;j<vec.size();j++){ if (vec[j]<vec[i]) swap(vec[j],vec[i]); } } } int main () { int n; scanf ("%d" ,&n); vector <int > vec; for (int i=0 ;i<n;i++){ int x; scanf ("%d" ,&x); vec.push_back(x); } select_sort(vec); for (int i=0 ;i<n;i++){ printf ("%d " ,vec[i]); } return 0 ; }
插入排序 平均时间复杂度为:O(n\^2);空间复杂度为O(1)。 稳定排序。
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 #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> using namespace std ;void insert_sort (vector <int > &vec) { if (vec.size()==0 ) return ; for (int i=1 ;i<vec.size();i++){ int temp=vec[i]; int j=i; while (j>0 && temp<vec[j-1 ]){ vec[j]=vec[j-1 ]; j--; } vec[j]=temp; } } int main () { int n; scanf ("%d" ,&n); vector <int > vec; for (int i=0 ;i<n;i++){ int x; scanf ("%d" ,&x); vec.push_back(x); } insert_sort(vec); for (int i=0 ;i<n;i++){ printf ("%d " ,vec[i]); } return 0 ; }
各大算法时间与空间复杂度对比