#include <cstdio> #include <cstdlib> #define leftChild(i) (2*(i)+1) //from index 0 void BubbleSort(int L[], int len); void SeletionSort(int L[], int len); void MergeSort(int L[],int m, int n); void QuickSort(int L[],int l, int r); void CountingSort(int L[], int M, int len); void InsertSort(int L[], int len); void HeapSort(int L[], int len); int main(int argc, char* argv[]) { int L[7]={3,1,2,245,3,378,3}; int i; //BubbleSort(L,7); //SeletionSort(L,7); //MergeSort(L,0,6); //QuickSort(L,0,6); //CountingSort(L, 7, 7); //InsertSort(L,6); HeapSort(L,7); //RadixSort(L,7); for(i=0;i<7;i++){ printf("%d ",L[i]); } printf("/n"); //printf("%d/n",Median3(L, 0, 2)); getchar(); return 0; } //O(n^2); O(1) //每次将最大移到最后 void BubbleSort(int L[], int len) { int i,j; for(i=len-1; i>0; i--){ bool isChanged = false; for(j=0;j<i;j++){ if(L[j]>L[j+1]){ L[j] = L[j+1]^L[j]; L[j+1] = L[j]^L[j+1]; L[j] = L[j]^L[j+1]; isChanged = true; } } if(!isChanged) break; } } //O(n^2); O(1) void SeletionSort(int L[], int len) { int i,j,k; //sorted part, unsorted part, min element in unsorted part for(i=0;i<len;i++){ //sorted area k=i; for(j=i+1;j<len;j++){ if(L[j]<L[k]) //find min k = j; } if(k!=i){ L[i]=L[i]^L[k]; L[k]=L[i]^L[k]; L[i]=L[i]^L[k]; } } } //time: O(nlogn) space:O(n) void Merge(int L[],int m, int k, int n){ int i,j,h; int* temp = (int*)calloc(n-m+1,sizeof(int)); h=0; i=m; j=k+1; while(h < n-m+1){ if(i>k) //merge temp[h++]=L[j++]; else if (j>n) temp[h++]=L[i++]; else if(L[i]>L[j]) temp[h++]=L[j++]; else temp[h++]=L[i++]; } for(h=0;h<n-m+1;h++){ L[m+h]=temp[h]; } free(temp); } void MergeSort(int L[],int m, int n) { int k; if(m < n){ k=m+(m-n)/2; MergeSort(L,m,k); MergeSort(L,k+1,n); Merge(L,m,k,n); } } inline void Swap(int *i, int *j) { int temp = *i; *i=*j; *j=temp; } int Median3(int L[], int l, int r) { int c=l+(r-l)/2; if(L[l]>L[c]) Swap(&L[l], &L[c]); if(L[c]>L[r]) Swap(&L[c],&L[r] ); if(L[l]>L[c]) Swap(&L[l], &L[c]); //printf("%d, %d, %d/n",L[l],L[c],L[r]); Swap(&L[c],&L[r-1]); return L[r-1]; } void QuickSort(int L[],int l, int r) { int i,j; int pivot; if(l+1<r){ //>3 element pivot=Median3(L,l,r); i=l; j=r-1; for(;;){ while(L[++i]<pivot); while(L[--j]>pivot); if(i<j) Swap(&L[i],&L[j]); else break; } Swap(&L[i],&L[r-1]); QuickSort(L, l, i-1); QuickSort(L, i+1, r); } else if(l<r){ if(L[l]>L[r]) Swap(&L[l],&L[r]); } } void CountingSort(int L[], int M, int len) { int * count = (int*)calloc(M+1, sizeof(int)); int i,j; for(i=0;i<len;i++){ count[L[i]]++; } for(i=0,j=0;i<len;i++){ while(!count[j]) j++; L[i]=j; count[j]--; } free(count); } //O(n^2) void InsertSort(int L[], int len) //the array should start from 1 to len { int i,j; for(i=1;i<len;i++){ j=i+1; if(L[j]<L[i]){ L[0]=L[j]; while(L[0]<L[i]){ L[i+1]=L[i]; i--; } L[i+1]=L[0]; } i=j-1; } } void PercolateDown(int L[],int i ,int len) { int child; int temp; for(temp=L[i]; leftChild(i)< len; i=child){ child=leftChild(i); if(child+1<len&&L[child+1]>L[child]) //check right child child++; if(temp<L[child]) L[i]=L[child]; else break; } L[i]=temp; } //O(nlogn); O(n)!! maxheap void HeapSort(int L[], int len) { int i; for(i=len/2-1;i>=0;i--) //len is not index, build heap PercolateDown(L, i, len); for(i=0;i<len;i++){ printf("%d ",L[i]); } printf("/n"); for(i=len-1; i>0; i--){ Swap(&L[i],&L[0]); //delete max PercolateDown(L,0,i);//heapify } } Keep working!!!~~