插入、选择、冒泡、归并、堆排序算法C++实现

//插入排序
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;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yb564645735/article/details/81159164