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

30.快速排序

时间:2023-06-27 20:00:29浏览次数:28  
标签:arr int 基数 30 high low 排序 快速 163

算法思想时这样的:

1.每次选取第一个数为基准数;

2.然后使用“乾坤挪移大法”将大于和小于基准的元素分别放置于基准数两边;

3.继续分别对基准数两侧未排序的数据使用分治法进行细分处理,直至整个序列有序。对于下面待排序的数组:

第一步:先选择第一个数163 为基准数,以163 为基准将小于它的数排在它前面,大于等于它的数排在其后,结果如下:

具体排列数据的步骤如下:

1.确定163 为基准数后,先把163 从数组中取出来

2.然后从最右端开始,查找小于基准数163 的数,找到162,将其移至空出来的元素中

3.接下来,从最左边未处理的元素中从左至右扫描比基数163 大的数,将其移动至右侧空出来的元素中

4.接下来,继续从最右边未处理的元素中从右至左扫描比基数163 小的数,将其移动至左侧空出来的元素中

接下来再重复执行步骤3,171 执行右移

重复执行步骤4,此时右边的值已经均大于基数,左边的值均已小于基数

接下来我们将基数保存回黄色空格中

第二步:采用分治法分别对基数左边和右边的部分运用第一步中的方法进行递归操作,直到整个数组变得有序,以左边的数组为例:

选择162 为基数,运用“乾坤挪移大法”得到结果如下:

以162 为界,把数组分成两个部分,此时,基数右侧已经没有数据,所以,接下来只要继续对左侧的数组分治处理即可,选择159 为基数,再次运用“乾坤挪移大法”得到结果如下:

代码实现:

#include <stdio.h>
#include <stdlib.h>

int partition(int arr[], int low, int high)
{
	int i = low;
	int j = high;
	int base = arr[low];

	if(low < high)
	{
		while (i < j)
		{
			while (i < j && arr[j] >= base)
			{
				j--;
			}

			if (i < j)//右边已经找到小于基数的数
			{
				arr[i++] = arr[j];
			}

			while (i < j && arr[i] < base)
			{
				i++;
			}

			if (i < j)//左边已经找到大于基数的数
			{
				arr[j--] = arr[i];
			}
		}

		arr[i] = base;
	}

	return i;
}

void QuickSort(int* arr, int low, int high)//实现快速排序
{
	if (low < high)
	{
		int index = partition(arr, low, high);

		QuickSort(arr, low, index - 1);
		QuickSort(arr, index + 1, high);
	}
}

int main()
{
	int arr[] = { 163, 161, 170, 158, 165, 171, 170, 163, 159, 162 };
	int len = sizeof(arr) / sizeof(arr[0]);

	int index = partition(arr, 0, len - 1);
	printf("分区完毕, 基数下标: %d\n", index);

	QuickSort(arr, 0, len - 1);
	printf("执行快速排序后的结果:\n");
	for (int i = 0; i < len; i++)
	{
		printf(" %d", arr[i]);
	}

	system("pause");
	return 0;
}

参考资料来源:

奇牛学院

标签:arr,int,基数,30,high,low,排序,快速,163
From: https://www.cnblogs.com/codemagiciant/p/17509799.html

相关文章

  • Python 选择排序
    思路:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾重复第二步,直到所有元素均排序完毕 Code:1defselectSort(arr):2foriinrange(0,len(arr)):#i表示多少......
  • 解决了yum 安装httpd的3001问题
    Repositorybaseislistedmorethanonceintheconfiguration查了各种资料,没解决,最后发现了错误原因(只是其中一种原因);   蓝色框:这些错误尝试各种解决仍无效。红色框:最后发现是yum被占用了。论看全部信息的重要性绿色框:果然yum被占用kill掉配置阿里源  wget-O......
  • 使用Spring Boot快速构建应用
    随着Spring4新版本的发布,SpringBoot这个新的子项目得到了广泛的关注,因为不管是Spring4官方发布的新闻稿还是针对首席架构师AdrianColyer的专访,都对这个子项目所带来的生产率提升赞誉有加。 SpringBoot充分利用了JavaConfig的配置模式以及“约定优于配置”的理念,能够极大的简......
  • P4630 [APIO2018] 铁人两项 题解
    一、题目描述:给你一个$n$个点,$m$条边的无向图。图不一定联通求出点对$(u,c,v)$的数量,使得点$u$存在一条经过点$c$到达点$v$的无向图。数据范围:$1\len\le1\times10^5,1\lem\le2\times10^5$ 二、解题思路:算是圆方树比较模板的题了......
  • 使用kubeadm快速部署一个K8s集群
    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令完成一个kubernetes集群的部署:#创建一个Master节点$kubeadminit#将一个Node节点加入到当前集群中$kubeadmjoin<Master节点的IP和端口>1.安装要求在开始之前,部署Kubern......
  • 20230525_1F-Lobby-多媒体系统
    项目设定本项目中,PB系统设定如下:IDIPPBApplicationPBVersionPBSystemFunctionPB-MANAGER-0110.236.0.2WidgetDesignerPBMasterV6.5.6V8.6.1*GlobalPBsysteminteractivecontrol*GlobalPBsystemcontrolandmanagementP......
  • Gin快速入门
    参考https://gin-gonic.com/zh-cn/docs/quickstart/安装goget-ugithub.com/gin-gonic/gin引入代码import"github.com/gin-gonic/gin"gomod管理一个新项目#创建新项目mkdirawesomeProjectcdawesomeProject#初始化gomodinit#拉取缺少的模块,移除不用的模块......
  • CMake快速入门
    CMake快速入门目录CMake快速入门1.为什么要使用CMake?2.创建第一个CMake工程3.CMake指令介绍3.1cmake_minimum_required指令3.2project指令3.3set指令3.4message指令3.5add_executable指令3.6add_subdirectory指令3.7add_library指令3.8add_compile_opti......
  • RAKsmart有奖问答,爆款免费领,前30名送随机微信红包!!!
    为更好的了解客户需求及RAKsmart自信不足,即日起,RAKsmart将推出有奖问卷调查,参与问卷调查即可领取SV1024MVPS使用一个月,同时,前30名参与问卷调查,可领取微信随机1~10元不等,送完即止,快来参与吧!活动时间:美国西岸圣何塞时间 06/26/2023~07/10/2023问卷调查地址:https://www.wenjuan.com/......
  • List排序
    List排序//按照某个字段进行正序排序list.sort((x,y)->Integer.compare(Integer.valueOf(x.getCourseDuration()),Integer.valueOf(y.getCourseDuration())));//按照某个字段进行倒序排序list.sort((x,y)->Integer.compare(Integer.valueOf(y.getCourseDuration()),Integer.......