快速排序算法实现(C版)

一趟快速排序的算法:
1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1即J--),找到第一个小于key的值A[j],A[j]与A[i]交换;
4)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于key的A[i],A[i]与A[j]交换;

5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时   候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)

 

算法复杂度:O(nlogn)

缺点:严重时会退化到O(n^2),例如选取的关键数据key是最小或最大的。

可以选取合适的关键数据,对下面的实现进行调整和优化。

 

源代码:

#include<stdio.h>
void QuickSort(int *pData, int left, int right)
{ 
    if(left > right)
        return; 
    int i = left;
    int j = right;
    int key = *(pData + left);
    while(i < j)
    {
        while(*(pData + j) >= key && i < j)
            j--;
        if(i < j)
        {
            //swap  *(pData + i) = key   
            *(pData + i) = *(pData + j);
            *(pData + j) = key;
        }
        while(*(pData + i)<= key && i < j)
            i++;
        if(i < j)
        {
            //swap *(pData + j) = key
            *(pData + j) = *(pData + i);
            *(pData + i) = key;
        }
        
    }
    //now the i = j,a[i] = key 
    QuickSort(pData, left, i - 1);
    QuickSort(pData, i + 1, right);
}
int main()
{   
    int i;
    int data[10] = {4,3,8,6,2,0,5,8,7,1};
    printf("Original:");
    for(i = 0; i < 10; i++)
    {
        printf("%d\t",data[i]);
    }
    QuickSort(data, 0, 9);
    printf("After quick sort:");
    for(i = 0; i < 10; i++)
    {
        printf("%d\t",data[i]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值