快速排序的一种实现

在code::blocks 17.12中运行正常

#include <stdio.h>
#include <stdlib.h>
int size=10;
int array[10]={13,81,92,43,65,31,57,26,75,0};

/**
5 快速排序
快速排序基本思路是,找到一个主元,让比主元小的数都在主元之前,比主元大的数都在主元之后。递归运算。
找主元是一个关键的问题。另外,当递归到数据较小的组时,使用其他排序方法更方便。
**/


void quick_sort(){
    put_pivot(0,size-1);
    print_array();
}

void put_pivot(int start,int end){
    if(start==end){//当只有一个数的情况
        printf("确定[%d]%d\n",start,array[start]);

        return;
    }
    if(start+1==end){//当只有2个数的情况
        if(array[start]>array[end]){
            exchange(start,end);
        }
        printf("确定[%d]%d, [%d]%d\n",start,array[start],end,array[end]);
        return;
    }

    choose_pivot(start,end);//先计算主元,并放在end-1处
    //现在主元被放在end-1的位置,只需要对start+1~end-2的位置进行排序
    int psmall=start;
    int pbig=end-1;
    while(1){
        while(array[++psmall]<array[end-1]){//small停在不small的地方
            ;
        }
        while(array[--pbig]>array[end-1]){//big指针停在不big的地方
            ;
        }
        if(psmall>=pbig){//跳出的情况
            exchange(end-1,psmall);//主元和psmall互换,主元位置不再变了
            printf("确定[%d]%d\n",psmall,array[psmall]);
            break;
        }
        exchange(pbig,psmall);//正常的情况:交换big small指针
    }
    //现在psmall是主元位置
    put_pivot(start,psmall-1);
    put_pivot(psmall+1,end);
}

void choose_pivot(int start,int end){
    //选择start center end的中位数作为主元,并移至end-1的位置
    int center=(end+start)/2;
    if(array[start]>array[center]){
        exchange(start,center);
    }
    if(array[end]<array[start]){
        exchange(end,start);
    }
    if(array[center]>array[end]){
        exchange(center,end);
    }
    exchange(center,end-1);
    //使主元固定的意义在于主元编号固定
    //使主元位于倒数第二位的意义在于这样做可以减少一次交换次序
    return;
}

void exchange(int i,int j){
    int temp=array[i];
    array[i]=array[j];
    array[j]=temp;
}

void print_array(){
    for(int i=0;i<size;i++){
        printf("[%d]%d ",i,array[i]);
    }
}

int main()
{
    quick_sort();
    return 0;
}

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页