如何快速理解快速排序及C++、python代码实现?

1、快速排序

快速排序又称为分割交换排序法,采用分治的方式,先从数据选定一个虚拟的中间值,并按照此中间值将所有待排序的数据分为两个部分,其中,小于中间值的数据放在左边,大于中间值的数据放在右边,再以相同的方式分别处理左右两边的数据,直到排序完成。

具体步骤:

  1. 对于给定的一个数列,首先选择一个键值;(这个值随意选择!)
  2. 将数列中的所有元素和这个基准元素进行比较,大于基准的数就放在基准的右边,小于基准的值就放在左边;
  3. 然后将基准值左右两边的子列看作两个新的数列,然后再对新的子数列进行重复上述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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaichu2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值