1、快速排序
快速排序又称为分割交换排序法,采用分治的方式,先从数据选定一个虚拟的中间值,并按照此中间值将所有待排序的数据分为两个部分,其中,小于中间值的数据放在左边,大于中间值的数据放在右边,再以相同的方式分别处理左右两边的数据,直到排序完成。
具体步骤:
- 对于给定的一个数列,首先选择一个键值;(这个值随意选择!)
- 将数列中的所有元素和这个基准元素进行比较,大于基准的数就放在基准的右边,小于基准的值就放在左边;
- 然后将基准值左右两边的子列看作两个新的数列,然后再对新的子数列进行重复上述1,2操作;
两种方法:这两种方法都差不多,最低还是要掌握一个方法!
1、填坑法:参考:快速排序(基本的挖坑填补法) - Curo - 博客园
2、指针交换法:参考:快速排序(挖坑法和前后指针法)--排序算法(四) - 程序员大本营
def quick_sort(b):
if len(b) < 2:
return b
# 选取基准,这里选的是中间
mid = b[len(b) // 2]
# 定义基准值左右两个数列
left,right = [],[]
# 从原始数组中移除基准值
b.remove(mid)
# 和基准值进行比较,大的放右边,小的放左边
for item in b:
if item >= mid:
right.append(item)
else:
left.append(item)
# 迭代比较
return quick_sort(left) + [mid] + quick_sort(right)
b = [1,0,23,19,3,27,8]
print(quick_sort(b))
c = [11, 99, 33, 69, 77, 88, 55, 11, 33, 36, 39, 66, 44, 22]
print(quick_sort(c))
# 返回第几大元素的值
print(quick_sort(c)[-(7)])
2、算法模板
C++版本:
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int q[N];
void quick_sort(int q[],int l,int r){
if(l>=r) return; //左边比右边大,直接退出
int x = q[l];//取左边第一个值作为起点
int i = l-1;//左边第二个值
int j = r+1;//右边值
//只有左边小于右边才能继续
while(i < j){
//左边的数小于中间值
do i++;while(q[i]<x);
//中间值小于右边值
do j--;while(q[j]>x);
//如果左边的值小于右边的值则将对应的值交换
if(i < j )swap(q[i],q[j]);
}
//左边排序
quick_sort(q,l,j);
//右边排序
quick_sort(q,j+1,r);
}
int main(){
//总共多少个数
scanf("%d",&n);
//键盘输入相应的个数的随机数字
for(int i = 0;i<n;i++) scanf("%d",&q[i]);
// 以第一个值作为左边的值,n-1作为右边的值
quick_sort(q,0,n-1);
for (int i = 0;i < n;i++) printf("%d ",q[i]);
return 0;
}
python版本2:
import random
# 随机输入一组数值
def inputarr(data,size):
for i in range(size):
data[i] = random.randint(1,100)
# 将随机生成的数据输出
def showdata(data,size):
for i in range(size):
print("%3d"%data[i],end='')
print()
def quick_sort(q,size,l,r):
"""
data:待排序的数据
size:数据的总数
l:左边的值
r:右边的值
"""
# 第一个键值为q[l],l的值取0表示选择第一个数作为键值
if (l < r):
# 左边开始
# 然后从第二个数开始判断
l_idx = l+1
# 从左到右边,如果这个值小于键值则继续,左边的idx向右移动(加1)
while(q[l_idx]<q[l]):
# 如果左边的idx大于总的数据长度就结束
if (l_idx+1>size):
break
l_idx += 1
# 右边开始
r_idx = r
# 右边的值肯定要大于键值
while(q[r_idx] > q[l]):
# 然后右边的索引值向前移动(减一操作)
r_idx -= 1
while(l_idx < r_idx):
# 将左右两边的值进行交换,
q[l_idx],q[r_idx] = q[r_idx],q[l_idx]
l_idx += 1
# 左边小于键值
while(q[l_idx]<q[l]):
l_idx += 1
# 右边向前移动
r_idx -= 1
while(q[r_idx] > q[l]):
r_idx -= 1
# 右边的值与键值交换
q[l],q[r_idx] = q[r_idx],q[l]
for i in range(size):
print("%3d" %q[i],end='')
print()
# 以r_idx为基准点分成左右两半以递归方式进行排序
quick_sort(q,size,l,r_idx-1)
quick_sort(q,size,r_idx+1,r)
data = [0]*100
size = int(input('请输入数列的大小(100以内的):'))
inputarr(data,size)
print("您输入的原始数字为:")
showdata(data,size)
print("排序的过程如下所示:")
# 快速排序
quick_sort(data,size,0,size-1)
print("最终的排序的结果为:")
showdata(data,size)
输出结果:
请输入数列的大小(100以内的):5 您输入的原始数字为: 70 15 42 12 56 排序的过程如下所示: 56 15 42 12 70 12 15 42 56 70 12 15 42 56 70 12 15 42 56 70 最终的排序的结果为: 12 15 42 56 70