动手敲算法——快速排序

本文介绍了一种改进的快速排序算法,通过使用三数取中法选择枢轴来提高排序效率。该方法首先交换数组中的元素,然后通过递归调用实现数组的排序。文中提供了一个具体的示例,展示了如何对一个包含10个整数的数组进行排序。
摘要由CSDN通过智能技术生成
#include <stdio.h>

void swap(int *x,int *y)    //交换两个数 
{
    *x = *x + *y - (*y = *x);   //不用参数实现两个数交换 

//  int teleftp;
//  teleftp = *x;
//  *x = *y;
//  *y = teleftp;
}

int midian3(int *a,int left,int right)  //三中值分割法
{
    int mid = (left + right) / 2;

    if(a[left] <= a[mid])
    {
        swap(&a[left],&a[mid]);
    }
    if(a[mid] <= a[right])
    {
        swap(&a[mid],&a[right]);
    }
    if(a[left] <= a[mid])
    {
        swap(&a[left],&a[mid]);
    }

    return a[mid];
} 

#if 1
void quicksort(int * a,int left,int right)
{
    int i = left+1,j = right;   //a[left]存放枢纽元,哨兵i从left+1开始移动 
    int mid;        
    int key;        

    if(left < right)
    {   
        mid = (left + right) / 2;   
        key = midian3(a,left,right);    
        swap(&a[left],&a[mid]);     //将枢纽元放到最左 
        while(i <= j)
        {

            while((i <= right) && (a[i] <= key))    //哨兵i左移 ,当遇到大于枢纽元的数则停下 
            {
                i++;
            }
            while((j >= left) && (a[j] > key))      //哨兵j右移 ,当遇到小于枢纽元的数则停下 
            {
                j--;
            }
            if(i < j)       //  交换两个数 
            {
                swap(&a[i],&a[j]);
            }           
        }
        //当i,j哨兵相遇,则停止 
        swap(&a[left],&a[j]);   //将枢纽元和哨兵停止的单元交换,即将中间元素插入中中间位置 
        quicksort(a,left,j-1);  //分治,递归 
        quicksort(a,j+1,right);
    }   
}
#endif


//测试 
int main(void)
{
    int a[10] = {2,2,23,666,0,9,4,7,34,12};
    int i;

    for(i=0;i<10;i++)
    {
        printf(" %d ",a[i]);
    }
    quicksort(a,0,9);
    printf("\n"); 
    for(i=0;i<10;i++)
    {
        printf(" %d ",a[i]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值