快速排序

本文介绍了一个基于快速排序算法的程序实现,特别关注了median3优化技巧,并结合插入排序提高小规模数组排序效率。代码详细展示了如何选取枢轴、划分数组以及递归排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求根据给定输入,按照课堂给定的快速排序算法进行排序,输出排序结果和median3的返回值。

 注:1,cutoff值为5,不足cutoff使用插入排序。

        2,输入、输出格式参见测试用例0。

测试输入

41
17
34
0
19
#

测试输入

After Sorting:
0 17 19 34 41 
Median3 Value:
none

源代码

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<math.h>  
#include <iostream>  
using namespace std;  
 
#define EQ(a,b) ((a) == (b))  
#define LT(a,b) ((a) < (b))  
#define LQ(a,b) ((a) <= (b))  
#define MAXSIZE 1000  
int a[MAXSIZE],y=0;  
  
void Median3(int map[], int p, int q )  //取前中后三个元素,然后最小的放在最前,最大的放在最后,中值放在最大的左边。   
{  
    int c = ( p + q ) / 2;  
    if( map[p] > map[c] ){  
        swap<int>(map[p], map[c]);  
     }  
    if( map[p] > map[q] ){  
        swap<int>(map[p], map[q]);  
     }    
    if( map[c] > map[q] ){  
        swap<int>(map[c], map[q]);  
     }  
    swap<int>(map[c],map[q-1]);   
    a[y++]=map[q-1];  
}  
   
void Insort(int num[],int i,int j){ // 一趟划分,采用三者取中值作主元   
    int k;   
    for(i=2;i<=j;i++){  
        num[0]=num[i];   
        k=i-1;  
        while(num[0]<num[k]){  //从零开始,则应防止数组下标越界,(不用0时,则必定不会越界,在0时,跳出)   
            num[k+1]=num[k];   
            k=k-1;   
        }         
        num[k+1]=num[0];  
    }  
}  
  
void QKsort(int num[],int low,int high)  
{     
    int i,j,temp;  
    Median3(num,low,high);  
    i=low;   //一定要从low开始,low+1的话与中值交换的下标不对。   
    j=high-1;  
    int x = num[j];      
    while(1){  
        while(num[++i]<x){   }  
        while(num[--j]>x){   }  
        if(i<j){            
            temp=num[i];  
            num[i]=num[j];  
            num[j]=temp;  
        }  
        else break;  
    }  
    num[high-1]=num[i]; //将中值放在中间。   
    num[i]=x;          
    if(low+5<=i)     
        QKsort(num,low,i-1);   
    else     
        Insort(num,low,i-1);  
    if(i+5<=high)     
        QKsort(num,i+1,high);    
    else   
        Insort(num,i+1,high);  
}  
   
int main(){  
    int num[MAXSIZE];    
    int i=1,j=1,k=0;  
    while((scanf("%d",&num[i])==1)){  
        getchar();  
        i++;   
    }     
    if(i>6)  
        QKsort(num,1,i-1);            
    else   
        Insort(num,1,i-1);  
    printf("After Sorting:\n");   
    while(j<i) {  
        printf("%d ",num[j]);   
        j++;  
    }  
    printf("\n");  
    printf("Median3 Value:\n");  
    if(y>0) {  
        while(k<y)  
        printf("%d ",a[k++]);  
        printf("\n");  
    }   
    else printf("none\n");  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值