1、算法思想
letcode中等75颜色分类解体思路
快速排序(固定取值的):利用分治+递归的思想,首先在这个序列中随便找一个数作为基值,然后将这个序列中所有比基准数大的数放在该数字的右边,比基准数小的数放在该数字的左边。然后在对这个数列两边的的子数字序列重复进行上述操作,最后即可以得到一个正确排序的数字序列,具体步骤如下。简而言之,可以理解为将选取的基值放在合适位置并满足左边小于等于它,右边大于等于它的结构。
2、具体步骤
假设现在有一个数字序列[10, 7, 11, 9, 1, 5] ,其中约定左边而iow,右边为high, 现在为方便取10作为基准值base且总是从右边开始,现在要做的时将找到的大于10的数目放在右边,反之小于的放在左边,通过数值大与小之间的交换使得基值被推向数列中间,完成排序。
-
第一轮
首先发现5<=10,high停下来,与左边low交换,[5, 7, 11, 9, 1, 10]。 -
第二轮
下一步轮到左边,5、7<=10,low++且到11>10,停下来将11放到右边[5, 7, 10, 9, 1, 11]。 -
第三轮
重复第一轮重右边开始,11>=10high++且1<10停下来,将1放到左边[5, 7, 1, 9, 10, 11] -
第四轮
下一步轮到左边,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;
}