【算法】Python & C++实现排序算法(七)之快速排序

1、算法思想
letcode中等75颜色分类解体思路
快速排序(固定取值的):利用分治+递归的思想,首先在这个序列中随便找一个数作为基值,然后将这个序列中所有比基准数大的数放在该数字的右边,比基准数小的数放在该数字的左边。然后在对这个数列两边的的子数字序列重复进行上述操作,最后即可以得到一个正确排序的数字序列,具体步骤如下。简而言之,可以理解为将选取的基值放在合适位置并满足左边小于等于它,右边大于等于它的结构。

2、具体步骤
假设现在有一个数字序列[10, 7, 11, 9, 1, 5] ,其中约定左边而iow,右边为high, 现在为方便取10作为基准值base且总是从右边开始,现在要做的时将找到的大于10的数目放在右边,反之小于的放在左边,通过数值大与小之间的交换使得基值被推向数列中间,完成排序。

  1. 第一轮
    首先发现5<=10,high停下来,与左边low交换,[5, 7, 11, 9, 1, 10]。

  2. 第二轮
    下一步轮到左边,5、7<=10,low++且到11>10,停下来将11放到右边[5, 7, 10, 9, 1, 11]。

  3. 第三轮
    重复第一轮重右边开始,11>=10high++且1<10停下来,将1放到左边[5, 7, 1, 9, 10, 11]

  4. 第四轮
    下一步轮到左边,1、9,10<=10,low++且此时low==high,完成一次快速排序,可以发现数字序列被分成两部分,base左边为全部小于它的集合,右边为大于它的集合。同时再将[5, 7, 1, 9, 10, 11] 分为 [5, 7, 1, 9]与 [ 11] 对于两个集合分别重复1-4步骤。最后在合成就可以得到有序的数值序列了。
    3、优点缺点
    优点:整体性能上优越
    缺点:不稳定,特别是固定点快速算法,关键在于基准值取值,取得好就快,去不好就慢。需要大量数据空间,对于少量数据排序无优势,还不用用插入排序,因此适用于大数据排序。

代码实现

# -*- coding: utf-8 -*-
# /usr/bin/python
# 作者:kimicr
# 实验日期:2020325
# Python版本:3.6.3
# 功能颜色分类Lc2_75
# 快速排序(平均常数内存,不稳定[nlogn,n^2])

def quick_sort(array,start,end):
    if start >= end:
        return
    base = array[start]  # 基准值
    left = start         # 左标点
    right = end          # 右标点
    while left < right:
        while left < right and array[right] >= base:
            right -= 1
        array[left], array[right] = array[right], array[left]
        
        while left < right and array[left] <= base:
            left += 1
        array[left], array[right] = array[right], array[left]
    quick_sort(array,start,left-1)   #递归
    quick_sort(array, left+1, end)
    # array[left] = base
li = [23, 94, 2, 21, 56, 6]
quick_sort(li, 0, len(li)-1)
print(li)
输出结果:[2, 6, 21, 23, 56, 94]
/*
作者:kimicr
时间:20200327
功能:【固定点】快速排序算法
特点:适用于大量数据排序,不稳定且时间复杂度【nlogn~ n^2】
*/
#include"iostream"
#include<stdlib.h>
using namespace std;

//交换函数
void swap(int *a, int l, int h)
{
	int temp;
	temp = a[l];
	a[l] = a[h];
	a[h] = temp;
}

//快速排序算法
void quick_sort(int *a, int start, int end)
{
	if (start >= end)
		return;
	int pviotkey,low,high;
	pviotkey = a[start];
	low = start;
	high = end;
	while (low < high)
	{
		while (low < high && a[high] >= pviotkey)
			high--;
		swap(a, low, high);

		while (low < high && a[low] <= pviotkey)
			low++;
		swap(a, low, high);
	}
	quick_sort(a, start, low - 1);
	quick_sort(a, low + 1, end);
	
}

int main()
{
	int a[10] = { 43, 65, 4, 23, 6, 98, 2, 65, 7, 79 };
	quick_sort(a, 0, 9);
	for (int i = 0; i < 10; i++)
		cout << a[i] << " ";
	cout << endl;
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值