快速排序

作者: 奇迹迪 | 来源:发表于2018-06-02 11:29 被阅读10次

快速排序

快速排序算法的核心思想是:

在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小或相等的元素移动到分割元素左侧位置,将待排序序列中所有比分割元素大的元素移动到元素右侧位置;

然后将分割元素左侧所有元素看作一个待排序子序列,重复上述过程,直到这些元素完全有序;

最后将分割元素右侧所有元素看作一个待排序子序列,重复上述过程,直到这些元素完全有序。

这里有一个在线演示各种排序的动画http://www.atool.org/sort.php

其实用文字去说明白一个算法的思想是有一定难度的,本文呢主要讲述的是算法的具体实现

思路:

1、 快速排序的核心:就是每次递归都会确定一个元素的最终位置;即分割点的确定
2、 我们首先找到分割点
3、 递归调用分割点左边的子序列
4、 递归调用分割点右边的子序列
5、 递归终止条件:子序列只有一个元素时,直接返回

好了知道了思路我们来实现一下

/**
 *快速排序
 * @param arr 数组
 * @param left 起始下标
 * @param right 结束下标
 */
void quickSort(int arr[] , int left , int right){
    srand(time(NULL));
    //递归终止条件
    if(left >= right){
        return;
    }

    //确定分割点
    int p = _partition(arr , left , right);

    //分割点的位置已经确定,不需要再进行排序
    quickSort(arr , left , p -1);
    quickSort(arr , p + 1 , right);
}
确定分割点

思路
1、 确定分割点的核心:就是我们取arr[left]为分割点, 我们把比arr[left]小的元素移动到arr[left]左边;否则相反
2、 我们先定义两个变量l = left + 1 , r = right ;
3、 我们从 l 下标向后遍历数组,比较arr[left] 和 arr[l] ,如果arr[l] 小于arr[left] , l++;否则,记录下标,停止遍历
4、 我们从 r 下标向前遍历数组,比较arr[left] 和 arr[r] ,如果arr[r] 大于arr[left],
r--;否则记录下标,停止遍历
5、 如果l > r , 说明整个数组已经遍历完,而且已经分好
6、 否则:交换arr[l] 和 arr[r] , 更新下标继续3-6
7、 当l > r 跳出循环时,我们需要交换arr[left] 和 arr[r];注:这时 r 指向的是小于arr[left]元素的下标
8、 把 r 返回即可

我们来实现一下

/**
 * 确定分割点
 * @param arr 数组
 * @param left 起始下标
 * @param right 结束下标
 * @return
 */
int _partition(int arr[] , int left , int right){
    swap(arr[left] , arr[ rand() % (right - left + 1) + left] );

    int l = left + 1;
    int r = right;

    int v = arr[left];
    while(true){

        while(arr[l] < v && l <= right){
            l++;
        }
        while(arr[r] > v && r >= (left + 1) ){
            r--;
        }

        if(l > r){
            break;
        }

        swap(arr[l] , arr[r]);
        l++;
        r--;
    }

    swap(arr[left] , arr[r]);
    return r;
}

相关文章

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • 算法笔记01-排序#2

    快速排序敢叫快速排序,那它一定得快。 快速排序 概述 快速排序也是分治排序的典型,它快,而且是原地排序。不过,要防...

  • PHP 实现快速排序

    导语 这篇了解下快速排序。 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-...

  • 快速排序的Python实现

    目录 快速排序的介绍 快速排序的Python实现 快速排序的介绍 快速排序(quick sort)的采用了分治的策...

  • 数据结构与算法 快速排序

    起因:快速排序,又称分区交换排序,简称快排,之前没有了解过,抽空学习一下。 快速排序 1 快速排序 快速排序的定义...

  • 数组-快速排序

    采用快速方式对数组进行排序 快速排序百科:快速排序(Quicksort)是对冒泡排序算法的一种改进.快速排序是通过...

  • OC数据结构&算法

    更多整理资料尽在?一平米小站 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 选...

  • 要成功就做一百题-94

    题目名称 今天来几个排序,都是经典题目,包括带拆分的快速排序,堆排序,归并排序。 描述 快速排序快速排序核心就是分...

网友评论

    本文标题:快速排序

    本文链接:https://www.haomeiwen.com/subject/bcxrsftx.html