十大排序算法C++实现

十大排序算法C++实现

七大基于选择的排序

#include<bits/stdc++.h>
using namespace std;
int a[100],n;
void bubbleSort(){//冒泡排序
    for(int i=1;i<=n-1;i++){
        for(int j=1;j<n-i+1;j++){
            if(a[j+1]<a[j]){
                swap(a[j+1],a[j]);
            }
        }
    }
}
void InsertSort(){//插入排序
    for(int i=2;i<=n;i++){
        int num=a[i];
        int cur=i;
        while(cur>=2&&a[cur-1]>num) a[cur]=a[cur-1],cur--;
        a[cur]=num;
    }
}
void selectSort(){//选择排序
    for(int i=1;i<=n;i++){
        int num=INT_MIN;
        int minId=-1;
        for(int j=1;j<=n-i+1;j++){
            if(a[j]>num){
                num=a[j];
                minId=j;
            }
        }
        swap(a[minId],a[n-i+1]);
    }
}
void shellSort(){//希尔排序
    for(int gap=n/2;gap>0;gap/=2){
        for(int i=gap+1;i<=n;i+=gap){
            int j=i;
            int num=a[i];
            while(j-gap>=1&&a[j-gap]>num) a[j]=a[j-gap],j-=gap;
            a[j]=num;
        }
    }
}
int myPartition(int l,int r){
    int id=l+1;
    int num=a[l];
    for(int i=l+1;i<=r;i++){
        if(a[i]<num){
            swap(a[i],a[id]);
            id++;
        }
    }
    swap(a[id-1],a[l]);
    return id-1;
}
void quickSort(int l,int r){//快速排序
    if(l>=r) return ;
    int pivot=myPartition(l,r);
    quickSort(l,pivot-1);
    quickSort(pivot+1,r);
}
void mergeSort(int l,int r){//归并排序
    if(l>=r) return ;
    int m=(l+r)/2;
    mergeSort(l,m);
    mergeSort(m+1,r);
    int tmp[100],tot=0;
    int i=l,j=m+1;
    while(i<=m&&j<=r){
        if(a[i]<a[j]) tmp[++tot]=a[i++];
        else tmp[++tot]=a[j++];
    }
    while(i<=m) tmp[++tot]=a[i++];
    while(j<=r) tmp[++tot]=a[j++];
    for(int i=l;i<=r;i++) a[i]=tmp[i-l+1]; 
}
void adjust(int root,int len){
    int lchild=root*2;
    int rchild=root*2+1;
    int maxId=root;
    if(lchild<=len&&a[lchild]>a[maxId]) maxId=lchild;
    if(rchild<=len&&a[rchild]>a[maxId]) maxId=rchild;
    if(maxId!=root){
        swap(a[maxId],a[root]);
        adjust(maxId,len);
    }
}
void heapSort(){//堆排序
    for(int i=n/2;i>=1;i--) adjust(i,n);
    for(int i=n;i>1;i--){
        swap(a[1],a[i]);
        adjust(1,i-1);
    }
}
int main(){
    freopen("in.txt", "r", stdin);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    // bubbleSort();
    // InsertSort();
    // selectSort();
    // shellSort();
    // quickSort(1,n);
    // mergeSort(1,n);
    // heapSort();

    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    printf("\n");
    return 0;
}

其他排序

#include<bits/stdc++.h>
using namespace std;
int a[100],n;
void countSort(){//计数排序
    int maxNum=100;
    int cnt[107]={0};
    for(int i=1;i<=n;i++) cnt[a[i]]++;
    n=0;
    for(int i=0;i<=maxNum;i++){
        while(cnt[i]>0){
            a[++n]=i;
            cnt[i]--;
        }
    }
}
void bucketSort(){//桶排序,类似于分块操作
    int MIN=*min_element(a+1,a+1+n);
    int MAX=*max_element(a+1,a+1+n);
    int bucketNum=(MAX-MIN)/n+1;
    vector<vector<int> > ans(bucketNum);
    for(int i=1;i<=n;i++){
        int num=(a[i]-MIN)/n;
        ans[num].push_back(a[i]);
    }    
    for(int i=0;i<bucketNum;i++) sort(ans[i].begin(),ans[i].end());
    n=0;
    for(int i=0;i<bucketNum;i++){
        for(int j=0;j<ans[i].size();j++){
            a[++n]=ans[i][j];
        }
    }
}
void radixSort(){//基数排序,先按照个位数排序,保证顺序的同时再按照百位数排序
    int maxDigit=0;
    int MAX=*max_element(a+1,a+1+n);
    while(MAX>0){
        MAX/=10;
        maxDigit++;
    }
    vector<int> cnt[10];
    int radix=1;
    
    for(int i=1;i<=maxDigit;i++){
        for(int j=0;j<=9;j++) cnt[j].clear();
        for(int j=1;j<=n;j++) cnt[a[j]/radix%10].push_back(a[j]);
        n=0;
        for(int j=0;j<=9;j++) for(auto val:cnt[j]) a[++n]=val;
        radix*=10;
    }
}
int main(){
    freopen("in.txt", "r", stdin);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    // countSort();
    // bucketSort();
    radixSort();
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    printf("\n");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于十大排序算法中的堆排序、选择排序和冒泡排序算法的C语言实现,可以参考如下代码: 堆排序: ```c void heapify(int *vec, int i, int len) { int left = i * 2 + 1; int right = i * 2 + 2; int largest = i; if (left < len && vec[left > vec[largest]) { largest = left; } if (right < len && vec[right > vec[largest]) { largest = right; } if (largest != i) { int temp = vec[i]; vec[i = vec[largest]; vec[largest = temp; heapify(vec, largest, len); } } void heapSort(int *vec, int len) { for (int i = len / 2 - 1; i >= 0; i--) { heapify(vec, i, len); } for (int j = len - 1; j > 0; j--) { int temp = vec = vec[j]; vec[j = temp; heapify(vec, 0, j); } } ``` 选择排序: ```c void selectionSort(int *vec, int len) { for (int i = 0; i < len - 1; i++) { int minIndex = i; for (int j = i + 1; j < len; j++) { if (vec[j < vec[minIndex]) { minIndex = j; } } if (minIndex != i) { int temp = vec[i]; vec[i = vec[minIndex]; vec[minIndex = temp; } } } ``` 冒泡排序: ```c void bubbleSort(int *vec, int len) { for (int i = 1; i < len; i++) { for (int j = 0; j < len - i; j++) { if (vec[j > vec[j + 1]) { int temp = vec[j]; vec[j = vec[j + 1]; vec[j + 1 = temp; } } } } ``` 这些代码分别实现了堆排序、选择排序和冒泡排序算法,可以通过传入一个整型数组和数组长度来对数组进行排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [用C++实现十大经典排序算法](https://blog.csdn.net/qq_34139994/article/details/128217009)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.239^v12^insert_chatgpt"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值