标签:
class Sort{ public: void printIt(int const * arr,int const n){ for (int i = 0; i < n; i++) { cout<<arr[i]<<" "; } } void swap(int * arr,int i,int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } //1.插入排序12:23----12:29, 6min void insertionSort(int * arr,int const n){ for(int i=1;i<n;i++){ int j=i-1; int tmp = arr[i]; while(j>=0 && arr[j]>tmp)arr[j+1] = arr[j--]; arr[j+1]=tmp; } } //2.堆排序12:32----12:53, 19min---写错了。 13:03修复正常,10min void heapSort(int * arr,int const n){ vector<int> vec; vec.push_back(0); //只是占位 for(int i=0;i<n;i++){ vec.push_back(arr[i]); } createHeap(vec); for(int i=n-1;i>0;i--){ arr[i] = vec[0]; vec[0] = vec[i+1]; vec.pop_back(); Sort::modifyHeap(vec,0); //这里又维护了下堆 } arr[0] = vec[0]; //所以是这个 } void createHeap(vector<int> &vec){ for(int i = vec.size()>>1;i>=0;i--){ modifyHeap(vec,i); } } void modifyHeap(vector<int> &vec,int i){ int lchild = i<<1; int rchild = lchild+1; int n = vec.size(); int max = i; if(lchild<n && vec[max]<vec[lchild])max=lchild; if(rchild<n && vec[max]<vec[rchild])max=rchild; if(max==i)return; else{ int tmp = vec[i]; vec[i] = vec[max]; vec[max] = tmp; } modifyHeap(vec,max); } //快速排序13:03---13:13,10min有bug, 1min修正 void quickSort(int * arr,int from,int to){ if(from<to){ int tmp = arr[from]; int i = from,j=to; while(i<j){ while(i<j && arr[j]>=tmp)j--; if(i<j)arr[i]=arr[j]; while(i<j && arr[i]<=tmp)i++; if(i<j)arr[j]=arr[i]; } arr[i]=tmp; quickSort(arr,from,i-1); quickSort(arr,i+1,to); } } //简单选择排序13:20---13:25,5min void simpleSelectionSort(int * arr, int const n){ for(int i=n-1;i>=0;i--){ int max = 0; for(int j=1;j<=i;j++){ if(arr[max]<arr[j])max =j; } swap(arr,max,i); } } //冒泡排序 13:26---13:32,6min 有bug,7min修复 void bubbleSort(int *arr,int n){ for(int i=n-1;i>0;i--){ bool b=true; for(int j=0;j<i;j++){ if(arr[j]>arr[j+1]){ swap(arr,j,j+1); b=false; } } if(b)return; } } //归并排序13:40---13:47, 7min有bug, 5min修复 void mergeSort(int * arr,int from, int mid, int to){ if(from<to){ mergeSort(arr,from,(from+mid)>>1,mid); mergeSort(arr,mid+1,(mid+1+to)>>1,to); int i= from,j= mid+1; vector<int> vec; while(i<=mid && j<=to){ if(arr[i]<arr[j])vec.push_back(arr[i++]); else vec.push_back(arr[j++]); } while(i<=mid)vec.push_back(arr[i++]); while(j<=to)vec.push_back(arr[j++]); for(int k = from,l=0;k<=to;k++,l++)arr[k] = vec[l]; } } //计数排序:对于每个元素,找小于x的元素的个数,如果有17个元素小于 //x,那么x就应该放在18号位置上。如果有17个元素小于等于x,x就可以放在 //第17个位置上,再减一。其中x∈关键字数组0~k。 //数组A[1..n]原始数组 //数组B[1..n]存放排列的输出 //数组C[1..n]: C[i]存放小于等于,且未输出的i的个数 void countSort(int * arr1,int *arr2,int const k,int const n){ vector<int> vec; for(int i=0;i<=k;i++)vec.push_back(0); for(int i=0;i<n;i++)vec[arr1[i]]++; for(int i=1;i<=k;i++)vec[i] += vec[i-1]; for(int i=n-1;i>=0;i--)arr2[(vec[arr1[i]]--)-1]=arr1[i]; } //希尔排序 void shellSort(int *arr,int n){ for(int span = n>>1;span>=1;span >>=1){ for(int i=0;i<span;i++){ insertionShellSort(arr,n,span,i); } } } void insertionShellSort(int *arr,int n,int span,int from){ for(int i=from+span;i<n;i += span){ int tmp = arr[i],j=i-span; while(j>=0 && tmp<arr[j]){ arr[j+span] = arr[j]; j -= span; } arr[j+span] = tmp; } } };
标签:
原文地址:http://www.cnblogs.com/kateblog/p/5509914.html