排序算法2-希尔排序&快速排序&合并排序&基数排序&堆积树排序

 排序算法2-希尔排序&快速排序&合并排序&基数排序&堆积树排序,完整代码请点击下载 

1、希尔排序

void shellSort(int data[],int size)
{
    int i;        // i为扫描次数
    int j;        // 以j来定位比较的元素
    int k=1;      // k打印计数
    int tmp;      // tmp用来暂存数据
    int jmp;      // 设置间距位移量
    jmp = size / 2;
    while (jmp != 0)
    {
        for (i = jmp; i < size; i++)
        {
            tmp = data[i];
            j = i - jmp;
            while(tmp < data[j] && j >= 0)  //插入排序法
            {
                data[j + jmp] = data[j];
                j = j - jmp;
            }
            data[jmp + j] = tmp;
        }
        cout<<"第 "<<k++<<" 次排序:\t";
        printData(data);
        jmp = jmp / 2;    //控制循环数
    }
}

2、快速排序

void quickSort(int d[],int size,int lf,int rg)
{
    int tmp;
    int lf_idx;
    int rg_idx;
    
    if(lf<rg)   //1:第一个键值为d[lf]
    {
        lf_idx=lf+1;
        rg_idx=rg;
        
        while(1) {
            cout<<"[处理过程"<<process++<<"]=> ";
            
            for(int t=0;t<size;t++)
                cout<<"["<<setw(2)<<d[t]<<"] ";
            cout<<endl;
            
            for(int i=lf+1;i<=rg;i++)  //2:从左向右找出一个键值大于d[lf]者
            {
                if(d[i]>=d[lf])
                {
                    lf_idx=i;
                    break;
                }
                lf_idx++;
            }
            
            for(int j=rg;j>=lf+1;j--)  //3:从右向左找出一个键值小于d[lf]者
            {
                if(d[j]<=d[lf])
                {
                    rg_idx=j;
                    break;
                }
                rg_idx--;
            }
            
            if(lf_idx<rg_idx)  //4-1:若lf_idx<rg_idx
            {
                tmp = d[lf_idx];
                d[lf_idx] = d[rg_idx];
                //则d[lf_idx]和d[rg_idx]互换
                d[rg_idx] = tmp;    // 然后继续排序 
            } else {
                break;    // 否则跳出排序过程 
            }
        }
        
        if(lf_idx>=rg_idx)  //5-1:若lf_idx大于等于rg_idx
        {// 则将d[lf]和d[rg_idx]互换
            tmp = d[lf];
            d[lf] = d[rg_idx];
            d[rg_idx] = tmp;

            //5-2:并以rg_idx为基准点分成左右两半
            quickSort(d,size,lf,rg_idx-1);
            
            //以递归方式分别为左右两半进行排序
            quickSort(d,size,rg_idx+1,rg);
            //直至完成排序
        }
    }
}

3、合并排序

void quickSort(int d[],int size,int lf,int rg)
{
    int tmp;
    int lf_idx;
    int rg_idx;

    //1:第一个键值为d[lf]
    if(lf<rg)
    {
        lf_idx=lf+1;
        rg_idx=rg;
        while(1) {
            for(int i=lf+1;i<=rg;i++)
            //2:从左向右找出一个键值大于d[lf]者
            {
                if(d[i]>=d[lf])
                {
                    lf_idx=i;
                    break;
                }
                lf_idx++;
            }
            for(int j=rg;j>=lf+1;j--)
            //3:从右向左找出一个键值小于d[lf]者
            {
                if(d[j]<=d[lf])
                {
                    rg_idx=j;
                    break;
                }
                rg_idx--;
            }
            if(lf_idx<rg_idx)
            //4-1:若lf_idx<rg_idx
            {
                tmp = d[lf_idx];
                d[lf_idx] = d[rg_idx];
                // 则d[lf_idx]和d[rg_idx]互换
                d[rg_idx] = tmp;      // 然后继续排序
            } else {
                break;    // 否则跳出排序过程
            }
        }
        if(lf_idx>=rg_idx)
        //5-1:若lf_idx大于等于rg_idx
        {   // 则将d[lf]和d[rg_idx]互换
            tmp = d[lf];
            d[lf] = d[rg_idx];
            d[rg_idx] = tmp;

            //5-2:并以rg_idx为基准点分成左右两半
            quickSort(d,size,lf,rg_idx-1);
            
            //以递归方式分别对左右两半进行排序
            quickSort(d,size,rg_idx+1,rg);
            //直至完成排序
        }
    }
}

void mergeSort(int list1[], int M, int list2[], int N, int list3[])
{
    int i = 0, j = 0, k = 0;
    
    while(i < M && j < N)
    {
        if(list1[i] <= list2[j])
            list3[k++] = list1[i++];
        else
            list3[k++] = list2[j++];
    }

    while(i < M)
        list3[k++] = list1[i++];
        
    while(j < N)
        list3[k++] = list2[j++];
}

4、基数排序

void radixSort(int data[],int size)
{
    for (int n=1;n<=100;n=n*10)    	// n为基数,从个位数开始排序
    {
        int tmp[10][100]={0};      	// 设置暂存数组,[0~9位数][数据个数],所有内容均为0
        for (int i=0;i<size;i++) 	// 对比所有数据
        {
            int m=(data[i]/n)%10;  	// m为n位数的值,例如37取十位数(37/10)%10=3
            tmp[m][i]=data[i];      // 把data[i]的值暂存在tmp中
        }
        
        int k=0;
        for (int i=0;i<10;i++)
        {
            for(int j=0;j<size;j++)
            {
                if(tmp[i][j] != 0)  // 因一开始设置 tmp = {0},故不为0者即为
                {
                    data[k]=tmp[i][j];// data暂存在tmp中的值,把tmp中的值放回data[]中
                    k++; 
                }
            }
        }
        
        cout<<"经过"<<setw(5)<<n<<"位数排序后:";
        printData(data,size);
    }
}

5、堆积树排序

void heapSort(int *data,int size)
{
    int i,j,tmp;
    
    for(i=(size/2);i>0;i--)
        // 建立堆积树节点
        ad_heap(data,i,size-1);
        
    cout<<"\n堆积内容:";
    for(i=1;i<size;i++)
        // 原始堆积树的内容
        cout<<setw(5)<<data[i];
    cout<<endl;
    
    for(i=size-2;i>0;i--)
    // 堆积排序
    {
        tmp=data[i+1];
        // 头尾节点交换
        data[i+1]=data[1];
        data[1]=tmp;
        ad_heap(data,1,i);
        
        // 处理剩余节点
        cout<<"\n处理过程:";
        for(j=1;j<size;j++)
            cout<<setw(5)<<data[j];
    }
}
void ad_heap(int *data,int i,int size)
{
    int j,tmp,post;
    j=2*i;
    tmp=data[i];
    post=0;
    
    while(j<=size && post==0)
    {
        if(j<size)
        {
            if(data[j]<data[j+1])
            // 找出最大节点
                j++;
        }
        if(tmp>=data[j])
            // 若树根较大,结束比较过程
            post=1;
        else
        {
            data[j/2]=data[j];
            // 若树根较小,则继续比较
            j=2*j;
        }
    }
    data[j/2]=tmp;
    // 指定树根为父节点
}

完整代码请点击下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackiendsc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值