排序算法(C++)

代码主要是将《算法导论》书中的伪代码实现了一遍,其中基数排序只能排2位数,3位数以上会出错,没找到原因,麻烦大佬能帮忙指出一下。桶排序没完成,有空再试一下。

#include <iostream>
#include <math.h>
#include <vector>
#define INF 0x3f3f3f3f
#define INX 0xc0c0c0c0
using namespace std;

void print(int a[],int n){
  for(int j= 0; j<n; j++){
    cout<<a[j] <<" ";
  }
  cout<<endl;
}

void insertSort(int a[],int n){
    int i=0,j=0;
    int tmp=0;
    for( i=1;i<n;i++){
        tmp=a[i];
        j=i-1;
       while(j>=0 && a[j]>tmp){
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=tmp;

    }
    cout<<"insertSort:"<<"";
    print(a,n);
}

void selectSort(int a[],int n){
    int i=0,j=0,k=0;
    int tmp=0;
    for(i=0;i<n-1;i++){
            k=i;
        for(j=i+1;j<n;j++){
            if(a[k]>a[j]) k=j;
        }
        tmp=a[i];
        a[i]=a[k];
        a[k]=tmp;
    }
    cout<<"selectSort:"<<"";
    print(a,n);

}

void mergeBoth(int a[],int p,int q,int r){
    int n1=q-p+1;
    int n2=r-q;
    int L[n1+1]={};
    int R[n2+1]={};
    int i=0,j=0,k=0;
    for(i=0;i<n1;i++){
        L[i]=a[p+i];
    }
    for(j=0;j<n2;j++){
        R[j]=a[p+n1+j];
    }
    L[n1]=INF;
    R[n2]=INF;
    i=j=0;
    for(k=p;k<=r;k++){
        if(L[i]<=R[j]){
            a[k]=L[i];
            i++;
        }else{
            a[k]=R[j];
            j++;
        }
    }

}

void mergeSort(int a[],int p,int r){
    int q=0;
    if (p<r){
        q=(p+r)/2;
        mergeSort(a,p,q);
        mergeSort(a,q+1,r);
        mergeBoth(a,p,q,r);
    }

}

int countingSort(int a[],int n){
    int i,j;
    int b[n]={};
    int max=INX;
    for (i=0;i<n;i++){
        if(a[i]>max){
            max=a[i];
        }
    }
    int c[max+1]={};
    for(i=0;i<max+1;i++){
        c[i]=0;
    }
    for(j=0;j<n;j++){
        c[a[j]]=c[a[j]]+1;
    }
    for(i=0;i<max+1;i++){
        c[i+1]=c[i]+c[i+1];
    }
    for(j=n-1;j>=0;j--){
        b[c[a[j]]-1]=a[j];
        c[a[j]]=c[a[j]]-1;
    }
    cout<<"coutingSort:"<<"";
    print(b,n);
}

int getDigitalNumInPos(int data, int pos)
{
    for(int i = 0; i < pos-1; i++){
        data = data/10;
    }

    int ret = data%10;
    //cout<<ret<<"";
    return ret;
}

void radixSort(int a[],int d,int n){
    int c[10]={};
    int b[n]={};
    for(int i=1;i<=d;i++){
        //countingSort
        for (int j=0;j<10;j++){
            c[j]=0;//clear the bucket

        }
        for (int k=0;k<n;k++){
            c[getDigitalNumInPos(a[k],i)]+=1;
        }
        for(int j=0;j<10;j++){
            c[j+1]=c[j]+c[j+1];

        }
        for(int k=n-1;k>=0;k--){
            b[c[getDigitalNumInPos(a[k],i)]-1]=a[k];
            c[getDigitalNumInPos(a[k],i)]-=1;
        }

        for(int k=0;k<n;k++){
            a[k]=b[k];

        }
    }

    cout<<"radixSort:"<<"";
    print(a,n);
}

void bucketSort(int a[],int n){
     //find minx max value of the array data
    int min = INX;
    int max = INF;
    for(int i = 0; i < n; i++)
    {
        if(a[i] < min)
            min = a[i];

        if(a[i] > max)
            max = a[i];
    }

    //get the bucket counts;
    int bucketCounts = (max-min)/n + 1;

    vector<vector<int>> bucketArrays;
    for(int i = 0; i < bucketCounts; i++)
    {
        //position 0 used to keep the data count store in this bucket
        vector<int> bucket;
        bucketArrays.push_back(bucket);
    }

    //assign each value to bucket arrays.
    for(int j = 0; j < n; j++)
    {
        int num = (a[j]-min)/n;
        bucketArrays[num].push_back(a[j]);
    }

    //sort each bucket
    for(int i = 0; i < bucketCounts; i++)
    {
        //std::sort(bucketArrays[i].begin(), bucketArrays[i].end());
        //insertSort(bucketArrays[i],n);
    }

    int index = 0;
    //collect value from radix arrays to data
    for(int k = 0; k < bucketCounts; k++)
    {
        for(int s = 0; s < bucketArrays[k].size(); s++)
        {
            a[index++] = bucketArrays[k][s];
        }
    }
    cout<<"bucketSort:"<<"";
    print(a,n);
}

void exchange(int a,int b){
    int tmp=a;
    a=b;
    b=tmp;
}

int partiton(int a[],int p,int r){
    int key=a[r];
    int i=p-1;
    for(int j=p;j<r-1;j++){
        if(a[j]<=key){
            i+=1;
            exchange(a[i+1],a[j]);
        }
    }
    exchange(a[i+1],a[r]);
    return i+1;
}

void quickSort(int a[],int p, int r){
    if(p<r){
        int q=partiton(a,p,r);
        quickSort(a,p,q-1);//q is sorted
        quickSort(a,q+1,r);

    }

}

void maxHeapiey(int a[],int i,int n){
    int l=2*i-1;
    int r=2*i;
    int largest;
    if ( l<=n && a[l]>a[i]){
        largest=l;
    }else{
        largest=i;
    }
    if ( r<=n && a[r]>a[largest]){
        largest=r;
    }
    if(largest!=i){
        exchange(a[largest],a[i]);
        maxHeapiey(a,largest,n);
    }
}

void buildMaxHeap(int a[],int n){
    for(int i=n/2;i>=0;i--){
        maxHeapiey(a,i,n);
    }
}

void heapSort(int a[],int n){
    buildMaxHeap(a,n);
    for(int i=n;i>0;i--){
        exchange(a[0],a[i]);
        n--;
        maxHeapiey(a,0,n);
    }
    cout<<"heapSort:"<<"";
    print(a,8);
}
int main(){
  int a[8] = {3,1,5,7,2,4,9,6};
  int t[8]={2,5,3,0,2,3,0,3};
  int d[5]={22,19,63,77,89};
  int c[7]={329,457,657,839,436,720,355};
  int f[7]={3290,4517,6257,8339,4436,5720,6355};
  insertSort(a,8);
  selectSort(a,8);
  mergeSort(a,0,7);
  cout<<"mergeSort:"<<"";
  print(a,8);
  countingSort(a,8);
  //radixSort(f,4,7);
  radixSort(d,2,5);
  quickSort(a,0,7);
  cout<<"quickSort:"<<"";
  print(a,8);
  heapSort(a,8);
  //bucketSort(a,8);
  //print(a);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值