八排序算法
nO(nlog2n)
keyword
1.(Straight Insertion Sort)
:
112
void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<8; j++){ cout<<a[j] <<" "; } cout<<endl; } void InsertSort(int a[], int n) { for(int i= 1; i<n; i++){ if(a[i] < a[i-1]){ //ii-1 int j= i-1; int x = a[i]; // a[i] = a[i-1]; // while(x < a[j]){ // a[j+1] = a[j]; j--; // } a[j+1] = x; // } print(a,n,i); // } } int main(){ int a[8] = {3,1,5,7,2,4,9,6}; InsertSort(a,8); print(a,8,8); }
On^2.
2-
2. Shell`s Sort
1959 D.L.Shell
- t1t2tkti>tjtk=1
- kk
- tim 1
d = {n/2 ,n/4, n/8 .....1}
n
dn/2,nd.d/21
void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<8; j++){ cout<<a[j] <<" "; } cout<<endl; } /** * * * @param int dk dk=1 * */ void ShellInsertSort(int a[], int n, int dk) { for(int i= dk; i<n; ++i){ if(a[i] < a[i-dk]){ //ii-1 int j = i-dk; int x = a[i]; // a[i] = a[i-dk]; // while(x < a[j]){ // a[j+dk] = a[j]; j -= dk; // } a[j+dk] = x; // } print(a, n,i ); } } /** * dn/2,n * */ void shellSort(int a[], int n){ int dk = n/2; while( dk >= 1 ){ ShellInsertSort(a, n, dk); dk = dk/2; } } int main(){ int a[8] = {3,1,5,7,2,4,9,6}; //ShellInsertSort(a,8,1); // shellSort(a,8); // print(a,8,8); }
3. Simple Selection Sort
12n-1n
n
n-1
.....
i i n-i+1 i
void print(int a[], int n ,int i){ cout<<""<<i+1 <<" : "; for(int j= 0; j<8; j++){ cout<<a[j] <<" "; } cout<<endl; } /** * 值 * * @return int 值 */ int SelectMinKey(int a[], int n, int i) { int k = i; for(int j=i+1 ;j< n; ++j) { if(a[k] > a[j]) k = j; } return k; } /** * * */ void selectSort(int a[], int n){ int key, tmp; for(int i = 0; i< n; ++i) { key = SelectMinKey(a, n,i); // if(key != i){ tmp = a[i]; a[i] = a[key]; a[key] = tmp; //i } print(a, n , i); } } int main(){ int a[8] = {3,1,5,7,2,4,9,6}; cout<<"值"; for(int j= 0; j<8; j++){ cout<<a[j] <<" "; } cout<<endl<<endl; selectSort(a, 8); print(a,8,8); }
,n[n/2]
void SelectSort(int r[],int n) { int i ,j , min ,max, tmp; for (i=1 ;i <= n/2;i++) { // n/2 min = i; max = i ; //keyword for (j= i+1; j<= n-i; j++) { if (r[j] > r[max]) { max = j ; continue ; } if (r[j]< r[min]) { min = j ; } } // tmp = r[i-1]; r[i-1] = r[min]; r[min] = tmp; tmp = r[n-i]; r[n-i] = r[max]; r[max] = tmp; } }
4. Heap Sort
nk1,k2,...,kn),
值()值值()
a96, 83,27,38,11,09)
(b) 1236248547305391
nn ()(n-1)n ()n
1. n
2. n-1
n-1
1m m-1
2
3 2.
4 2.
5
n
1n
2
3
4938659776132749
void print(int a[], int n){ for(int j= 0; j<n; j++){ cout<<a[j] <<" "; } cout<<endl; } /** * H[sm]H[s] * H[s],.s, * * @param H * @param s * @param length * */ void HeapAdjust(int H[],int s, int length) { int tmp = H[s]; int child = 2*s+1; //(i+1 ) while (child < length) { if(child+1 <length && H[child]<H[child+1]) { // () ++child ; } if(H[s]<H[child]) { // H[s] = H[child]; // s = child; // s , child = 2*s+1; } else { // break; } H[s] = tmp; // } print(H,length); } /** * * H[0..length-1] * */ void BuildingHeap(int H[], int length) { // i= (length -1) / 2 for (int i = (length -1) / 2 ; i >= 0; --i) HeapAdjust(H,i,length); } /** * */ void HeapSort(int H[],int length) { // BuildingHeap(H, length); // for (int i = length - 1; i > 0; --i) { //H[0] int temp = H[i]; H[i] = H[0]; H[0] = temp; // HeapAdjust(H,0,i); } } int main(){ int H[10] = {3,1,5,7,2,4,9,6,10,8}; cout<<"值"; print(H,10); HeapSort(H,10); //selectSort(a, 8); cout<<""; print(H,10); }
:
k2(k-1)k
4n O(nlogn )
5. Bubble Sort
void bubbleSort(int a[], int n){ for(int i =0 ; i< n-1; ++i) { for(int j = 0; j < n-i-1; ++j) { if(a[j] > a[j+1]) { int tmp = a[j] ; a[j] = a[j+1] ; a[j+1] = tmp; } } } }
exchange
1pos,pos,pos
:
void Bubble_1 ( int r[], int n) { int i= n -1; //, while ( i> 0) { int pos= 0; //, for (int j= 0; j< i; j++) if (r[j]> r[j+1]) { pos= j; // int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp; } i= pos; // } }
2值值,值() ,
:
void Bubble_2 ( int r[], int n){ int low = 0; int high= n -1; //值 int tmp,j; while (low < high) { for (j= low; j< high; ++j) //, if (r[j]> r[j+1]) { tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp; } --high; //high值, for ( j=high; j>low; --j) //, if (r[j]<r[j-1]) { tmp = r[j]; r[j]=r[j-1];r[j-1]=tmp; } ++low; //low值, } }
6. Quick Sort
1,,
2值值 值值
3
4
a
b
void print(int a[], int n){ for(int j= 0; j<n; j++){ cout<<a[j] <<" "; } cout<<endl; } void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int partition(int a[], int low, int high) { int privotKey = a[low]; // while(low < high){ // while(low < high && a[high] >= privotKey) --high; //high low+1 swap(&a[low], &a[high]); while(low < high && a[low] <= privotKey ) ++low; swap(&a[low], &a[high]); } print(a,10); return low; } void quickSort(int a[], int low, int high){ if(low < high){ int privotLoc = partition(a, low, high); // quickSort(a, low, privotLoc -1); // quickSort(a, privotLoc + 1, high); // } } int main(){ int a[10] = {3,1,5,7,2,4,9,6,10,8}; cout<<"值"; print(a,10); quickSort(a,0,9); cout<<""; print(a,10); }
O(nlog2n)
,k,k值 8 ,
void print(int a[], int n){ for(int j= 0; j<n; j++){ cout<<a[j] <<" "; } cout<<endl; } void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int partition(int a[], int low, int high) { int privotKey = a[low]; // while(low < high){ // while(low < high && a[high] >= privotKey) --high; //high low+1 swap(&a[low], &a[high]); while(low < high && a[low] <= privotKey ) ++low; swap(&a[low], &a[high]); } print(a,10); return low; } void qsort_improve(int r[ ],int low,int high, int k){ if( high -low > k ) { //k, k int pivot = partition(r, low, high); // Partition qsort_improve(r, low, pivot - 1,k); qsort_improve(r, pivot + 1, high,k); } } void quickSort(int r[], int n, int k){ qsort_improve(r,0,n,k);//Qsort // for(int i=1; i<=n;i ++){ int tmp = r[i]; int j=i-1; while(tmp < r[j]){ r[j+1]=r[j]; j=j-1; } r[j+1] = tmp; } } int main(){ int a[10] = {3,1,5,7,2,4,9,6,10,8}; cout<<"值"; print(a,10); quickSort(a,9,4); cout<<""; print(a,10); }
7. Merge Sort
Merge
r[in]r[im]r[m+1n]n-i +1n-m
- j=m+1k=ii=i; //
- i>m j>n //
- //r[i]r[j]rf
r[i]<r[j]rf[k]=r[i] i++ k++
rf[k]=r[j] j++ k++ - //rf
i<=mr[im]rf[kn] //
j<=n , r[jn] rf[kn] //
//r[im]r[m +1 n]rf[in] void Merge(ElemType *r,ElemType *rf, int i, int m, int n) { int j,k; for(j=m+1,k=i; i<=m && j <=n ; ++k){ if(r[j] < r[i]) rf[k] = r[j++]; else rf[k] = r[i++]; } while(i <= m) rf[k++] = r[i++]; while(j <= n) rf[k++] = r[j++]; }
1 n 1 n/21 2n
void print(int a[], int n){ for(int j= 0; j<n; j++){ cout<<a[j] <<" "; } cout<<endl; } //r[im]r[m +1 n]rf[in] void Merge(ElemType *r,ElemType *rf, int i, int m, int n) { int j,k; for(j=m+1,k=i; i<=m && j <=n ; ++k){ if(r[j] < r[i]) rf[k] = r[j++]; else rf[k] = r[i++]; } while(i <= m) rf[k++] = r[i++]; while(j <= n) rf[k++] = r[j++]; print(rf,n+1); } void MergeSort(ElemType *r, ElemType *rf, int lenght) { int len = 1; ElemType *q = r ; ElemType *tmp ; while(len < lenght) { int s = len; len = 2 * s ; int i = 0; while(i+ len <lenght){ Merge(q, rf, i, i+ s-1, i+ len-1 ); // i = i+ len; } if(i + s < lenght){ Merge(q, rf, i, i+ s -1, lenght -1); // } tmp = q; q = rf; rf = tmp; //q,rfq rf } } int main(){ int a[10] = {3,1,5,7,2,4,9,6,10,8}; int b[10]; MergeSort(a, b, 10); print(b,10); cout<<""; print(a,10); }
void MSort(ElemType *r, ElemType *rf,int s, int t) { ElemType *rf2; if(s==t) r[s] = rf[s]; else { int m=(s+t)/2; /**p */ MSort(r, rf2, s, m); /*p[sm]p2[sm]*/ MSort(r, rf2, m+1, t); /*p[m+1t]p2[m+1t]*/ Merge(rf2, rf, s, m+1,t); /*p2[sm]p2[m+1t]p1[st]*/ } } void MergeSort_recursive(ElemType *r, ElemType *rf, int n) { /**p */ MSort(r, rf,0, n-1); }
8. /(Radix Sort)
值n O(n log n)
[1..1000]nA[1..n]
10B[1][1..10]B[2] (10..20]B[i]( (i-1)*10, i*10]i = 1,2,..100 100
A[1..n]A[i]B[j] 100
nmn/m
O(n + m * n/m*log(n/m)) = O(n + nlogn - nlogm)
mnO(n)
n
On2O(nlogn)On
1值0m-1mm
2
keywordO(n)
:
52 值
< < <
值 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 10 < J < Q < K < A
值
值值
14 值4
213 值13 (2 3 ...A )值13 4 ()23 4 值4
n d {k1k2kd}{k1k2kd}r[i]r[j](1ijn)
k1 kd
(Most Significant Digit first)MSD
1k1 k1
2k2 kd
3值MSD
(Least Significant Digit first)LSD
1) kd kd-1k1
2) , 值LSD
LSD
keywordkeywordkeywordkeyword-值4值13值4值13
:
Void RadixSort(Node L[],length,maxradix) { int m,n,k,lsp; k=1;m=1; int temp[10][length-1]; Empty(temp); // while(k<maxradix) //keyword { for(int i=0;i<length;i++) // { if(L[i]<m) Temp[0][n]=L[i]; else Lsp=(L[i]/m)%10; //keyword Temp[lsp][n]=L[i]; n++; } CollectElement(L,Temp); // n=0; m=m*10; k++; } }
O(n)
nO(nlog2n)
(1)(O(n2))
:
(2)(O(nlog2n))
(3)O(n1+)),01
(4)(O(n))
On
On2
:keyword
1n
2keyword
3keyword
4
n.
1nO(nlog2n)
keyword
2 n =
3n
5
6
1keyword
2keyword
3
http://blog.csdn.net/hguisu/article/details/7776068