//插入排序
void insertSort(vector<int> &num){
for(int i=1;i<num.size();i++){
for(int j = i-1;j>=0;j--){
if(num[j]>num[j+1])
swap(num[j], num[j+1]);
else break;
}
}
}
//选择排序
void selectionSort(vector<int> &num){
for(int i=num.size();i>1;i--){
int max = num[0],idx = 0;
for(int j=1;j<i;j++){
if(num[j]>max){
max=num[j];
idx=j;
}
}
swap(num[idx], num[i-1]);
}
}
//冒泡排序
void bubbleSort(vector<int> &num){
int hi = num.size(), lo;
bool sorted=false;
while(!sorted){
sorted = true;lo=0;
while(++lo < hi){
if(num[lo-1]>num[lo]){
swap(num[lo-1], num[lo]);
sorted = false;
}
}
hi--;
}
}
//归并排序
void mergeSort(vector<int> &vec){
int hi= vec.size(),lo=0;
mergesort(vec, lo, hi);
}
void mergesort(vector<int> &vec, int lo, int hi){
if( hi - lo < 2) return;
int mi = (hi + lo) / 2;
mergesort(vec, lo, mi);mergesort(vec, mi, hi);
merge(vec, lo, mi, hi);
}
void merge(vector<int> &vec, int lo, int mi, int hi){
int lb = mi - lo, lc = hi - mi;
int* B = new int[lb];
for(int i=0; i<lb; i++) B[i] = vec[lo+i];
for(int i=0,j=0,k=0; (j<lb||k<lc);){
if((k<lc) && (j>=lb || vec[mi+k]<=B[j])) {vec[lo+i] = vec[mi+k];i++;k++;}
if((j<lb) && (k>=lc || vec[mi+k]>B[j])) {vec[lo+i] = B[j++];i++;}
}
delete [] B;
}
//堆排序
void heapSort(vector<int> &vec){
int len = vec.size(), i;
for(i = len/2 - 1; i >= 0; --i){
heapify(vec, i, len);
}
for(int i=len-1; i>0; i--){
swap(vec[i], vec[0]);
heapify(vec, 0, i);
}
}
void heapify(vector<int> &vec, int first, int end){
int father = first;
int son = father*2 + 1;
while(son < end){
if(son+1 < end && vec[son+1] > vec[son]) ++son;
if(vec[father]>=vec[son]) break;
else{
swap(vec[father], vec[son]);
father = son;
son = father*2 + 1;
}
}
}
插入、选择、冒泡、归并、堆排序算法C++实现
猜你喜欢
转载自blog.csdn.net/yb564645735/article/details/81159164
今日推荐
周排行