排序(插入,归并)
1.Insert sort
#include<iostream> using namespace std; int a[50]; int n; void in_sort(){ for(int i=2;i<=n;i++){ for(int j=i;j>1;j--){ if(a[j]<a[j-1]){ int t=a[j]; a[j]=a[j-1]; a[j-1]=t; } } } } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } in_sort(); for(int i=1;i<=n;i++){ cout<<a[i]<<' '; } return 0; }
空间复杂度:O(1)
时间复杂度:O(n^2)
最优时间复杂度:already sorted array 外层n,内层1 O(n)
最坏时间复杂度:reversly sorted array O(n^2)
2.merge sort
“分治的思想”
divide and conquer
#include<iostream> using namespace std; int a[50]; int n; void merge(int a[],int L,int M,int R){ int left_v=M-L+1; int right_v=R-M; int left[left_v]; int right[right_v]; //fill in the left sub array for(int i=L;i<=M;i++){ left[i-L+1]=a[i]; } //fill in the right sub array for(int i=M+1;i<=R;i++){ right[i-M]=a[i]; } //merge into the original array int i=1;int j=1;int k=L; while(i<=left_v && j<=right_v){ if(left[i] < right[j]){ a[k]=left[i]; i++; k++; }else{ a[k]=right[j]; j++; k++; } } while(i<=left_v){ a[k]=left[i]; i++; k++; } while(j<=right_v){ a[k]=right[j]; j++; k++; } } void divide(int a[],int L,int R){ if(L == R){ return; } int mid=(L+R)/2; divide(a,L,mid); divide(a,mid+1,R); merge(a,L,mid,R); } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } int L=1; int R=n; int mid=(L+R)/2; divide(a,L,R); for(int i=1;i<=n;i++){ cout<<a[i]<<' '; } return 0; }
时间复杂度:Merge-Sort is O(nlogn), the reversed order does not affect the split and merge.