快速排序

任晟麒  •  2年前


/*
如果两个数长短不同,且长数的高位上的数字与短数相同,那么
如果长数接下来的数字比长数最高位的数字要大,则对换长数和短数
*/

#include<iostream>
#include<cstring>
#include <string>
using namespace std;
void QuickSort(int a[][11],int start,int end,int deep){
    if(start>=end||a[start][deep]==-1||a[end][deep]==-1){        
        return;
    }        
    int left=start,right=end,key[10];
    memmove(key,a[left],40);
    int b=0,c=0;//当key的位置固定后,c记录了它右边与之相同的个数,b记录了它左边与之相同的个数
    while(left<right){
        while(left<right){
            if(key[deep]>a[right][deep])right--;
            else if(key[deep]==a[right][deep]){c++;right--;}
            else{memmove(a[left],a[right],40);break;}
        }
        while(left<right){
            if(key[deep]<a[left][deep])left++;
            else if(key[deep]==a[left][deep]){b++;left++;}
            else{memmove(a[right],a[left],40);break;}
        }
    }
    //固定key的位置
    memmove(a[left],key,40);
    //如果我这个位置已经最深了,但是我右边那个位置更深,且它更深一层的数比我开头的数还大
    //那么我和它互换
    if(a[left][deep+1]<0&&a[left+1][deep+1]>a[left][0]){
            int temp[10];
            memmove(temp,a[left],40);
            memmove(a[left],a[left+1],40);
            memmove(a[left+1],temp,40);
        }
    //加深深度,按区间排序
    QuickSort(a,left-b,right+c,deep+1);
    //当key所在的区间排好序后,在当前的深度下把key两边的一维数组排序
    QuickSort(a,start,--right,deep);
    QuickSort(a,++left,end,deep);
}

//这个函数用来把一个数值的每位数字值按原来的顺序放入一个长度为10的数组,数组后面不足的部分用-1代替
void SeperateNumber(int a[11],int number){
    string s=to_string(number);
    int l=s.length();
    for(int i=0;i<l;i++){
        a[i]=int(s[i])-48;
    }
    for(int i=l;i<11;i++){
        a[i]=-1;
    }
}
int main(){
    int n,t;
    cin>>n;
    int a[n][11];
    for(int i=0;i<n;i++){
        cin>>t;
        SeperateNumber(a[i],t);
    }
    QuickSort(a,0,n-1,0);
    for(int i=0;i<n;i++){
        for(int j=0;j<10;j++){
            if(a[i][j]>-1){
                cout<<a[i][j];
            }else{
                break;
            }
        }
    }
}

评论:

请先登录,才能进行评论