快速排序算法

来源:互联网 发布:js怎么获取当前日期 编辑:程序博客网 时间:2024/04/29 23:03

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


【思想】

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


【实例说明】

快速排序数组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;}

【输出】
这里写图片描述

0 0
原创粉丝点击