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;
}
}
};