首页 > 其他分享 >快速排序

快速排序

时间:2025-01-16 15:26:38浏览次数:1  
标签:20 16 快速 31 67 59 排序 95

快速排序
每次选择一个数为中间值,将数比该数小的数放在该数左边,比该数大的数放在该数右边,再重复对该数左右两边的数进行该操作,直到所有数都排列完毕。
例:
int a[10]={1,465,31,59,18,67,95,16,20,6};
我们选定6为中间数
第一次排序:
1,6,31,59,18,67,95,16,20,465

对6左边数进行排序结果不变:
1,6,31,59,18,67,95,16,20,465
对6右边数进行排序,选择465做中间数,结果不变:
1,6,31,59,18,67,95,16,20,465
对中间数465左边排序,选20为中间数:
18换31:
1,6,18,59,31,67,95,16,20,465
16换59:
1,6,18,16,31,67,95,59,20,465
20换31:
1,6,18,16,20,67,95,59,31,465
对20左边数排序,选16作为中间数:
16换18
1,6,16,18,20,67,95,59,31,465
对20右边数排序,选31作为中间数:
31换67:
1,6,16,18,20,31,95,59,67,465
对31左边排序,左边顺序正确
对31右边数排序,选67作为中间数:
59换95:
1,6,16,18,20,31,59,95,67,465
95换67:
1,6,16,18,20,31,59,67,95,465
至此,全部排列完成

例:

#include<stdio.h>

int QuickSort(int a[],int left,int right)
{
	int i=left,j=left;
	int temp=0;
	for(;i<right;i++)//i负责遍历数组,j指向数组最左边,每找到一个数就+1
	{
		if(a[i]<a[right])//i遍历到一个数小于a[right],即中间数
		{
			temp=a[j];
			a[j]=a[i];
			a[i]=temp;
			j++;	//找到小数后将该数换到j记录的左边位置,然后j右移一个位置,等待下一个小数
		}
	}
	temp=a[right];//遍历完数组,所有的小数都被找到并放在左边,但中间数还在数组最右端,因此将中间数换到中间,也就是j记录的位置
	a[right]=a[j];
	a[j]=temp;
	for(int i=0;i<10;i++)
	{
		printf("%d ",a[i]);
		if(i==j)printf("|");
	}
	printf("j:%d\n",j);
	return j;//返回中间值位置j
	
}

void sort(int a[],int left,int right)
{
    
    if(left<right)//先判断该需要排列区间的左边界left与右边界right是否相交,不相交代表该区间可以继续排序
    {
	    int temp=QuickSort(a,left,right);//先进行一次排序,分割出两个区间
    	sort(a,left,temp-1);//对中间数左边的区间进行排序
    	sort(a,temp+1,right);//对中间数右边的区间进行排序
	}
	
	
	
}

int main()
{
	int a[10]={1,465,31,59,18,67,95,16,20,6};
	sort(a,0,sizeof(a)/sizeof(a[0])-1);
	
	for(int i=0;i<10;i++)
	{
		printf("%d\t",a[i]);
	}
	return 0;
 }

运行结果如图,被框起的就是每次的中间数,默认为区间最右边的数,加粗地方为被分割出的待排序空间
①:主函数调用的sort:
1 |6|31 59 18 67 95 16 20 465 j:1
②:主函数调用的sort中的sort(a,left,temp-1):[1]left<right不成立,不进行迭代
③:主函数调用的sort中的sort(a,temp+1,right):[31,59,18,67,95,16,20,465]
1 6 31 59 18 67 95 16 20 |465 | j:9
④:主函数调用的sort中的sort(a,temp+1,right)中的sort(a,left,temp-1):[31,59,18,67,95,16,20]
1 6 18 16 |20|67 95 59 31 465 j:4
⑤:主函数调用的sort中的sort(a,temp+1,right)中的sort(a,left,temp-1)中的sort(a,left,temp-1):[18,16]
1 6 |16|18 20 67 95 59 31 465 j:2 之后不满足left<right不成立,不进行迭代
⑥:主函数调用的sort中的sort(a,temp+1,right)中的sort(a,left,temp-1)中的sort(a,temp+1,right):[67,95,59,31]
1 6 16 18 20 |31|95 59 67 465 j:5 左区间不满足left<right,迭代右区间
⑦:主函数调用的sort中的sort(a,temp+1,right)中的sort(a,left,temp-1)中的sort(a,temp+1,right)中的sort(a,temp+1,right):[95,59,67]
1 6 16 18 20 31 59 |67|95 465 j:7 全部排列完成

1 6 16 18 20 31 59 67 95 465

如图:

标签:20,16,快速,31,67,59,排序,95
From: https://www.cnblogs.com/Osen/p/18674939

相关文章

  • php根据权重自定义排序
    <?php//支付列表数组$paymentList=[['name'=>'支付宝','info'=>'支持多种支付场景','weight'=>3],['name'=>'微信支付','info'=>'便捷的移动支付','wei......
  • 2025年网络安全零基础自学全攻略:避开弯路,快速上手!
     自学网络安全是一项充满挑战的任务,但只要遵循合适的学习路径,能够有效避免走弯路,逐步建立知识体系,最终可以在该领域取得成就。本文将为你提供2025年最新的网络安全自学攻略,帮助你高效地规划学习路线,掌握网络安全的核心......
  • C/C++基础之sort排序
    sort(起始地址,结束地址的下一位,比较函数)注:比较函数可写可不写。默认sort函数是升序排序的。使用方法如下:#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta[100]; intn;//数组的实际长度 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//取消同......
  • IDEA如何快速定位到某一行某一列?
    前言大家好,我是小徐啊。我们在开发Java应用的时候,一般是用IDEA来开发的,毕竟这是一款功能强大的开发工具。我们可以使用IDEA做很多事情,今天小徐就来介绍下在使用IDEA开发的时候,如何快速定位到某个文件的某一行某一列。如何快速定位到某一行某一列首先,我们需要打开要查找的文件,如......
  • 快速入门Interceptor拦截器
    1.概念2.执行流程3.WebConfig配置类packagecom.hz.config;importcom.hz.interceptor.LoginCheckInterceptor;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springfram......
  • Gradio快速入门详细教程
    Gradio是什么?Gradio是一个开源的Python软件包,可以快速为你的机器学习模型、API或任意Python函数构建一个演示或Web应用程序。你可以通过Gradio内置的共享功能在几秒钟内分享你的演示链接。不需要JavaScript、CSS或Web托管经验!只需几行Python代码即可创建你......
  • 快速开始
    快速入门运行环境安装Node.js并且版本大于8.0基础库版本为2.7.3及以上开发者工具版本为1.02.1907232及以上安装使用小程序自动化SDK,直接执行以下命令:npmiminiprogram-automator--save-dev使用首先开启工具安全设置中的CLI/HTTP调用功能。必须开启以上......
  • Codeforces 1536B Prinzessin der Verurteilung 题解 [ 紫 ] [ 后缀自动机 ] [ 动态规
    PrinzessinderVerurteilung:最短未出现字符串的板子。思路考虑在SAM上dp,定义\(dp_i\)表示从\(i\)节点走到NULL节点所花费的最少步数。显然我们建出反图,跑DAG上dp即可。转移如下:\[dp_i=1+\min_{j=1}^{|v_i|}dp_{v_{i,j}}\]输出方案的话记录下每个dp值的先驱,最......
  • 【快速入门|文末福利】运筹学|初识线性规划(一条逻辑线,只需初中数学基础)
    导学问题/回忆自测三个核心问题“线性”为何?何谓“标准”?如何“化归”(把一般的线性规划问题转化为标准的线性规划问题)提示字面意思,在三个要素、两个关系之间对三个要素的要求“大”、“大”、“等”反转(乘以-1)/补齐/“分身”逻辑线索(逻辑线索中,发现有不熟悉的名词没关系,......
  • springboot3+快速集成jwt指南
    首先简单回忆一下思路:登录接口为用户生成一个jwt,jwt存于redis中。在使用后续功能通过web拦截器拦截,先获取校验jwt是否过期,再决定是否放行。后续根据jwt中取出来的信息即可实现简单的鉴权总体来说功能如下:本博客以springboot3+为例,使用jjwt0.12.3<dependency>......