快速排序

来源:互联网 发布:js mouseout 编辑:程序博客网 时间:2024/06/12 21:28

快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

基本思想:
进行一趟排序
1、 要先将待排序列中选一个记录出来作为标准,称为枢纽。
2、 将要排序的数据分割成独立的两部分,其中一部分的所有数据都比枢纽都要小,另一部分比枢纽大。
3、 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

举个例子:将序列(42,30,68,98,86,15,57)进行快速排序

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这时即划分完毕,为(15,30),42,(98,86,68,57)

于是经过递归调用后,排序完毕。

原始序列:
(42,30,68,98,86,15,57)
一次划分后:
(15,30),42,(98,86,68,57)
分别对42两边进行快排:
15,(30 结束),42,(57,86,68),98
15,30,42,57,(86,68),98
15,30,42,57,68,86,98 (结束)

代码分析
设置启动函数,即调用qSort(),指定起点为数组起点,终点为数组尾部

void quickSort(int * list, int length)//启动函数,length为数组长度{    qSort(list, 0, length - 1);         //指定是整个数组    return;}

qSort()是递归调用函数,参数为数组,以及排序起点,排序终点。通过partition()得到划分位置的枢纽后,如果起点仍小于终点时,递归调用qSort(),对左边和右边进行排序。

void qSort(int * list, int start, int end)          //递归调用{    int partpos = partition(list, start, end);      //通过调用划分函数,返回枢纽的位置                                                    //枢纽的左边是比枢纽小的数,枢纽的有右边是比枢纽大的数    if (start < end)    {        qSort(list, start, partpos - 1);            //对枢纽左边的数调用qSort进行递归调用进行排序        qSort(list, partpos + 1, end);              //对枢纽右边的数调用qSort进行递归调用进行排序    }    return;}

partition() 是对数组的划分,然后返回枢纽位置。把第一个记录拿出来作为枢纽,将low指向待排记录的第一个记录,high指向最后一个记录。首先将high所指的位置先前移动,直到找到第一个比枢纽关键字小的记录并将其复制至low所指的位置。然后将low所指的位置先后移动,直到找到第一个比枢纽关键字大的记录并将其复制至high所指的位置。如此反复交替移动位标high和low,直至low和high 相等,将枢纽复制至low所指的位置。

int partition(int * list, int low, int high)        //一次划分{    int temp = list[low];                           //将list[low]作为枢纽,存到temp中    while (low < high)                              //要时刻保证low<high    {        while (low < high && list[high] > temp)     //当list[high]的数大于temp时,high指针往下指                                                    //相当于保证比枢纽小的数一直在前面,后面都为比枢纽大的数据        {            high--;        }        list[low] = list[high];                     //如果list[high]<temp时,跳出循环,把这个数放到前面枢纽的位置        while (low < high && list[low] < temp)      //当list[low]的数小于temp时,low指针往上指                                                    //相当于保证比枢纽大的数放在后面,前面都为比枢纽小的数据        {            low++;                                              }        list[high] = list[low];                     //此时list[low]的数比枢纽大,将这个数后移至list[high]处    }    list[low] = temp;                               //把枢纽放在low位上,这时前面的数据比枢纽小,后面的数据比枢纽大    return low;                                     //返回枢纽的位置}
0 0
原创粉丝点击