QuickSort快速排序详细分析

QuickSort快速排序详细分析


C.A.R.Hoare发明的快速排序虽然使用了大致相同的思想(这就是为什么我们首先介绍中值排序),但事实上确实比中值排序简单。
在快速排序中,我们不再寻找中值,而是通过某些策略(有时是随机的,有时是最左的,有时是中间的)来选择一个元素,这个元素将数组切分成了两个子数组。快排包含两步,如下图所示。首先数组根据中枢值分成两个数组,左子数组的元素都小于或者等于中枢值,右子数组的元素都大于或者等于中枢值。然后每个子数组被递归地排序。

 

 


图:快速排序详解

 

2 代码实现(python版本)

 

# !/usr/bin/python
# -*- coding: UTF-8 -*-
# auther: 大成
# date  :2020.4.4
import random


import time;  # 引入time模块

def random_int_list(start, stop, length):
  start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start))
  length = int(abs(length)) if length else 0
  random_list = []
  for i in range(length):
    random_list.append(random.randint(start, stop))
  return random_list

def QuickSort(arr):
    if len(arr) < 2:
        return arr
    # 选取基准,随便选哪个都可以,选中间的便于理解
    mid = arr[len(arr) // 2]
    # 定义基准值左右两个数列
    left, right = [], []
    # 从原始数组中移除基准值
    arr.remove(mid)
    for item in arr:
    # 大于基准值放右边
        if item >= mid:
            right.append(item)
        else:# 小于基准值放左边
            left.append(item)
# 使用迭代进行比较
    return QuickSort(left) + [mid] + QuickSort(right)


starttime = time.time()
c=random_int_list(1,500,100)
endtime=time.time()

d=QuickSort(c)
print("快速排序运行时间:",endtime-starttime)
print("随机       数组:",c)
print("快速排序后的数组:",d)



3.运行结果

快速排序运行时间: 0.00033402442932128906 随机       数组: [103, 28, 221, 424, 327, 374, 135, 246, 251, 408, 109, 74, 142, 157, 160, 182, 314, 354, 474, 140, 377, 96, 257, 82, 24, 459, 370, 205, 496, 287, 481, 135, 432, 159, 56, 281, 85, 209, 423, 4, 276, 109, 321, 21, 499, 114, 391, 4, 256, 482, 487, 298, 191, 330, 126, 296, 38, 228, 401, 72, 131, 171, 133, 350, 289, 400, 16, 423, 412, 108, 366, 398, 337, 308, 219, 314, 176, 339, 432, 178, 498, 343, 224, 272, 154, 160, 247, 177, 59, 426, 201, 135, 127, 311, 123, 356, 350, 47, 82] 快速排序后的数组: [4, 4, 16, 21, 24, 28, 38, 47, 56, 59, 72, 74, 82, 82, 85, 96, 103, 108, 109, 109, 114, 123, 126, 127, 131, 133, 135, 135, 135, 140, 142, 154, 157, 159, 160, 160, 171, 176, 177, 178, 182, 191, 201, 205, 209, 219, 221, 224, 228, 246, 247, 251, 256, 257, 272, 276, 281, 287, 289, 296, 298, 308, 311, 312, 314, 314, 321, 327, 330, 337, 339, 343, 350, 350, 354, 356, 366, 370, 374, 377, 391, 398, 400, 401, 408, 412, 423, 423, 424, 426, 432, 432, 459, 474, 481, 482, 487, 496, 498, 499]