天天看点

快速排序(双指针法)二、为什么要使用快速排序?

一、快速排序的思想是什么?

从数组中选取一个元素作为基准值,将待排序的数组分成左右两部分,左边的部分小于基准值,右边的部分大于基准值。左右两部分继续如此递归下去,不断分裂,直到待排序数组的元素为1,此时递归条件结束。

所以,我们重点关心的就是,在一段待排序数组中选一个基准值(一般选择待排序数组的第一个元素);使用左右两个指针向中间移动,左边的指针在比基准值大的下标时停下,右边的指针在比基准小的下标时停下,双方交换数组元素,继续向左、向右移动。

这一轮的移动到什么地方停止呢?那就是在左右指针下标值相等的时候,将这个下标值的元素与基准值元素交换。一轮下来,这个基准值位置确定,就不会再发生改变了。以它为分界线,分成左右两部分,剩下的排序它都不用参与了。

分开了左右两段之后,我们把左右段看成各自独立的待排序数组就好,做法与上面一致,只不过此时的待排序数组比较短了。使用递归实现就非常方便。

在不断的分裂过后,待排序数组只为一个元素的时候,排序就结束了。

二、为什么要使用快速排序?

从时间复杂度分析,排序一轮的执行次数与冒泡排序类似,一个长度为n的数组执行次数都是n;差别在排序的轮数;假设一个长度为8的数组,冒泡排序不管情况是好还是坏,都是执行7轮(n*n);对于快速排序,最差的情况才是7轮,一般为3轮(n * 

快速排序(双指针法)二、为什么要使用快速排序?

).

三、代码(c语言)

下面是c语言实现代码,可以参考一下

#include <stdio.h> 

/*
  快速排序,双指针、递归实现 ;固定一个自定义变量,作为数据调换的中转空间。
*/
/*

int partion(int * num, int startindex, int endindex)
{
    
    int temp, left, right;
    int pivot = num[startindex];
    left = startindex;
    right = endindex;
    while(left != right){
        //从右边向左边遍历,大于基准值向左移动,小于基准值停下
        while(left < right && num[right] > pivot){
            right--;
        }
        //从左边向右边遍历,小于基准值向右移动,大于于基准值停下
        while(left < right && num[left] <= pivot){
            left++;
        } 
        
        //交换左右指针的值
        if(left < right)
        {
            temp = num[left];
            num[left] = num[right];
            num[right] = temp;    
        }
        
    }
    temp = num[left];
    num[left] = num[startindex];
    num[startindex] = temp;
    return left;
}
*/

/* 挖坑法
   左右指针数值吊换的时候,坑不断移动
 */ 
int partion(int * num, int startindex, int endindex)
{
    
    int temp, left, right, index;
    int pivot = num[startindex];
    index = startindex;
    left = startindex;
    right = endindex;
    while(left != right){
        while(left < right && num[right] > pivot){
            right--;
        }
        num[index] = num[right];
        index = right;
        
        while(left < right && num[left] <= pivot){
            left++;
        } 
        num[index] = num[left];
        index = left;    
    }
    num[left] = pivot;
    return left;
}

void quicksort(int * num, int startindex, int endindex)
{
    if(startindex >= endindex){
        return ;
    }
    int pivot_index = partion(num, startindex, endindex);
    quicksort(num, startindex, pivot_index - 1);
    quicksort(num, pivot_index+1, endindex);
}

int main()
{
    int num1[] = {6, 1, 2, 7, 9, 3, 4 ,5, 10};
    quicksort(num1,0, 8);
    for(int i = 0; i < 9; i++)
        printf("%d ", num1[i]);
}           

继续阅读