码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序算法

时间:2015-05-27 22:50:51      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:快速排序

在前面博客有写英文版的快速查找实现例子,在复习的时候,有了新的领悟。


【思想】

快速排序算法关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的移动到数组左边,比选择的数字大的移动到数组的右边。


【实例说明】

快速排序数组data[] = {2,4,9,3,6,7,1,5},设置第一个数为基准值,将其他元素与其进行比较,数组长度为8,设置两个指针i,j分别指向待排序数组首末下标,待比较情况进行移动:
第一组排序:
以基准值basis = data[0] = 2对数组进行划分调整顺序,让小于2的都在它的左边,大于2的都在它的右边,具体实现思想为,先对data[j]进行操作,当data[j]> basis, j减1,向前移动一个,否则将data[j]的值填补data[i],data[j]就变成下次待填补对象,i此时向后移动一格,并开始对data[i]进行操作,如果data[i]< basis,i加1,向后移动一格,否则就将data[i]的值填补此时的data[j],data[i]此时变成待填补对象,j向前移动,重复前面的步骤,直到i = j时,说明全部比较完了,填补此时data[i]的位置,如此便能得到以基准值划分出来的左边小于basis,右边大于basis的情况。过程如下图所示:
技术分享
这一组排序以basis = data[i],i = 0,j = 7,排序后得到的数组{1,2,9,3,6,7,4,5}
第二组排序:i = 0 , j = 0, basis = data[i] =1,排序后得到的数组{1,2,9,3,6,7,4,5}
第三组排序:i = 2, j=7, basis = data[i] = 9,排序后得到的数组{1,2,5,3,6,7,4,9}
技术分享
第四组排序:i=2,j=6,basis = data [2] = 5,排序后得到的数组{1,2,4,3,5,7,6,9}
技术分享
第五组排序:i = 2,j = 3,,basis = data[2] = 4,排序后得到的数组{1,2,3,4,5,7,6,9}
技术分享
第五组排序:i = 5,j = 6,basis = data[5] = 7,排序后得到的数组{1,2,3,4,5,6,7,9}
技术分享


【测试代码】

#include<stdio.h>

void quicksort(int data[],int lo,int hi)
{
    if(lo>=hi)
        return;

    int i=lo , j=hi;
    int basis = data[lo];
    while(i < j)
    {
        while((data[j] > basis)&&(i<j))
            j-- ;
        if(i<j)//这块一定要有这个判断,否则会出错
        {       
            data[i++] = data[j];
        }

        while((data[i] < basis)&&(i<j))
            i++;
        if(i<j)
        {   
            data[j--] = data[i];        
        }
    }
    data[ i ] = basis;
    quicksort(data, lo, i-1 );
    quicksort(data, i+1, hi);
}

int main()
{
    int i;
    int data[] = {2,4,9,3,6,7,1,5};

    quicksort(data , 0 , 7);

    for(i=0;i<8;i++)
        printf("%d ",data[i]);

    return 0;
}

【输出】
技术分享

快速排序算法

标签:快速排序

原文地址:http://blog.csdn.net/xinyu913/article/details/46054265

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!