谈谈快速排序

前言

本文章主要讲解快速排序的原理以及代码实现。

快速排序基于的思想(分治法)

分治法的简述

分治法是指将一个难以直接解决的大问题,划分成一些规模较小的子问题,以便各个击破,分而治之。

谈谈快速排序_第1张图片

分治法的求解过程

分治法求解问题的主要步骤:划分,求解,合并。

(1)问题划分。将规模为n的问题划分成k个子问题;

(2)求解子问题。各子问题的求解方法相同,通常采用递归方法实现;

(3)合并子问题的解。将各子问题的解逐层合并,得到问题的最终解。

快速排序的分治策略

(1)划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列r1… ri-1和ri+1 … rn,前一个子 序列中记录的值均小于或等于轴值,后一个子序列中记录的值均大于或等于轴值;

(2)求解子问题:分别对划分后的每一个子序列递归处理;

(3)合并:由于对子序列r1 … ri-1和ri+1 … rn的排序是就地进行的,所以合并不需要执行任何操作。

谈谈快速排序_第2张图片

举例子说明

对序列[23,13,35,6,19,50,28]进行快速排序的过程。(注意:这里以第一个记录作为轴值,黑体代表轴值)

一次划分过程,如下图:

谈谈快速排序_第3张图片

以轴值为基准将待排序序列划分为两个子序列后,对每一个子序列分别递归进行处理,下图是一个快速排序的完整的例子。

谈谈快速排序_第4张图片

算法实现

 int Partition(int r[ ], int first, int end)
 {
      int i=first, j=end;         //初始化
      int temp;
   
       while (i

快速排序时间复杂度和空间复杂度分析

谈谈快速排序_第5张图片

注意:一个序列基本有序用快速排序反而是不合适的!

你可能感兴趣的:(算法,分治法,快速排序)