C++实现各种排序算法(堆排序、快速排序、归并排序、希尔排序、插入排序、选择排序、冒泡排序)

7个常用的排序算法

1.冒泡排序

void BubbleSort1(vector<int> &x){
    int n = x.size();
    for(int i=0;i<n;i++){
        for(int j = i+1;j<n;j++){
            if(x[i]>x[j]){
                swap(x[i],x[j]);
            }
        }
    }
}

2.直接选择排序

void SelectSort(vector<int> &x){
    int min_number = 0;
    int i,j;
    for(i = 0;i<x.size();i++){
        min_number = i;
        for(j = i+1;j<x.size();j++){
            if(x[j]<x[min_number]){
                min_number = j;
            }
        }
        if(min_number!=i){
            swap(x[min_number],x[i]);
        }
    }
} 

3. 直接插入排序

void InsertSort(vector<int> &x){
    int flag = 0;
    for (int i = 1; i < x.size(); ++i) {
        flag = i;
        for(int j = i-1;j>=0;j--){
            if(x[j]>x[flag]){
                swap(x[j],x[flag]);
            }
            flag--;
        }
    }
}

4. 希尔排序

void ShellSort(vector<int> &x){
    int increment = x.size();
    while(increment>0){
        increment = increment/2;
        for(int i = 0;i<increment;i++){
            for(int j = increment+i;j<x.size();j+=increment){
                int k = j;
                while(k>=increment&&(x[k]<x[k-increment])){
                    swap(x[k],x[k-increment]);
                    k-=increment;
                }
            }
        }
    }
}

5. 最大堆排序

void HeadAdjust(vector<int>&x, int s,int n){
    for(int i = 2*s;i<=n;i*=2){
        if(i<n && x[i-1]<x[i]){
            i++;
        }
        if(x[s-1]>x[i-1]){
            break;
        }
        swap(x[s-1],x[i-1]);
        s=i;
    }
}

void HeadSort(vector<int>& x){
    int n = x.size();
    for(int i = n/2;i>0;i--){
        HeadAdjust(x,i,n);
    }
    for(int i = n;i>1;i--){
        swap(x[0],x[i-1]);
        HeadAdjust(x,1,i-1);
    }
}

6. 归并排序

void Merge(vector<int>&arr,vector<int>&temp,int left,int mid,int right){
    int l = left;
    int r = mid+1;
    int k = 0;
    while(l<=mid && r<=right){
        if(arr[l]<arr[r]){
            temp[k++] = arr[l++];
        }
        else{
            temp[k++] = arr[r++];
        }
    }
    while(l<=mid){
        temp[k++] = arr[l++];
    }
    while(r<=right){
        temp[k++] = arr[r++];
    }
    k = 0;
    while(left<=right){
        arr[left++] = temp[k++];
    }
}

void MSort(vector<int>&arr,vector<int>&temp,int left,int right){
    if(left<right){
        int mid = (left+right)/2;
        MSort(arr,temp,left,mid);
        MSort(arr,temp,mid+1,right);
        Merge(arr,temp,left,mid,right);
    }
}

void MergeSort(vector<int>& x){
    vector<int> temp(x.size());
    MSort(x,temp,0,x.size()-1);
}

7.快速排序

int Partition(vector<int> &x,int low,int high){
    int temp = x[low];
    while(low<high){
        while(low<high && x[high]>=temp){
            high--;
        }
        swap(x[low],x[high]);
        while (low<high && x[low]<=temp){
            low++;
        }
        swap(x[low],x[high]);
    }
    return low;
}
void QSort(vector<int>&x,int low,int high){
    int pivot;
    if(low<high){
        pivot = Partition(x,low,high);
        QSort(x,low,pivot);
        QSort(x,pivot+1,high);
    }
}
void QuickSort(vector<int>& x){
    QSort(x,0,x.size()-1);
}

8.测试用例

int main() {
    vector<int> vector_test;
    vector_test.resize(100);
    for(int i = 0;i<100;i++){
        vector_test[i] = rand()%100;
    }
    QuickSort(vector_test);
    vector<int>::iterator it = vector_test.begin();
    for(;it!=vector_test.end();it++){
        cout<<*it<<"  ";
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值