首页 > 编程语言 >C++快速排序

C++快速排序

时间:2023-08-11 22:32:49浏览次数:32  
标签:arr int 快速 C++ 数组 排序 分界 left

快速排序介绍:

基础思路:

首先快速排序是由冒泡排序所改进的,都是通过多次比较和交换来实现排序,但快速排序是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,分别对这两部分记录继续进行排序,以达到整个序列有序。

思路详解:

(1)首先我们先设定一个分界值(也就是基准),通过该分界值将数组分成左右两部分。

(2)然后我们将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

(3)左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

(4)重复上述过程,可以看出,这其实就是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

代码详细:

#include<iostream>
using namespace std;
int arr[100],n;//全局变量
void quicksort(int left,int right){
		int i,j,k,temp;
		if(left > right) return;
		temp = arr[left]; //先将基准数保存下来,这里选择左边为基准数
		i=left; j=right;
		while(i!=j){
			//先从右往左找,找到比基准数小的数
			while(arr[j] >= temp && i < j)
			    j--;
			
			//再从左往右找,找到比基准数大的数
			while(arr[i] <= temp && i < j)
			    i++;
			
			//如果是找到,而不是i和j相遇了,就交换他们的位置
			if(i < j){
				k=arr[i];
				arr[i]=arr[j];
				arr[j]=k;
			}
		}//退出时 i = j 此时将基准数和 i(或j)位置的数交换
		arr[left]=arr[i];
		arr[i]=temp;
		//交换完基准数后 继续处理左右的位置
		quicksort(left,i-1);
		quicksort(i+1,right);
		return;
}
int main(){
	int i;
	printf("数据个数:\n");
	scanf("%d",&n);
	printf("输入%d个数据:\n",n);
	for(i=0;i<n;i++)
	    scanf("%d",&arr[i]);
	quicksort(0,n-1);
	printf("排序后的数据为:\n");
	for(i=0;i<n;i++)
	    printf("%d ",arr[i]);
	printf("\n");
	return 0;
}

运行效果:

C++快速排序_快速排序

当然这里是按从小到大的顺序进行排序,我们也可以通过改变比较的大小情况,改为从大到小进行排序。

学习flag:

我会在51CTO上持续更新使用C++写的一些算法学习讲解,感谢大家的支持

标签:arr,int,快速,C++,数组,排序,分界,left
From: https://blog.51cto.com/u_16183699/7053714

相关文章

  • Objective-C 语法快速参考(附:Learning_Objective-C_A_Primer_中文版)
    关联:1.http://cocoadevcentral.com/d/learn_objectivec/2.http://www.otierney.net/objective-c.html.zh-tw.big53.http://www.geekylemon.com/xcodetutorials.htm4.http://www.cocoachina.com/b/ 大部分有一点其他平台开发基础的初学者看到XCode,第一感想是磨拳擦......
  • 快速幂算法
    快速幂算法快速幂算法是一种高效的计算幂的方法,它的核心思想是将指数分解为二进制形式,然后通过迭代计算得到结果。本文将详细介绍快速幂算法的原理、流程以及C++代码实现,并给出一个例题及题解。原理快速幂算法的基本思想是将指数表示为二进制形式,然后通过迭代计算得到结果。具......
  • [转]c++ function使用方法
    原帖:https://blog.csdn.net/myRealization/article/details/111189651 cppreference https://en.cppreference.com/w/cpp/utility/functional/functionboost源码剖析之:泛型函数指针类boost::functionhttps://blog.csdn.net/pongba/article/details/1560773c++模板偏特化 h......
  • 插入排序(LOW)
    博客地址:https://www.cnblogs.com/zylyehuo/#_*_coding:utf-8_*_definsert_sort(li):foriinrange(1,len(li)):#i表示摸到的牌的下标tmp=li[i]j=i-1#j指的是手里的牌的下标whilej>=0andli[j]>tmp:li[......
  • 【数据结构】排序2 插入排序
    插入排序的基本思想:每次将一个待排序的记录按其关键字大小插入前面已经排好序的序列,直到全部关键字都插入到子序列中为止。根据这种思想有这几种常用的插入排序算法:直接插入,折半插入和希尔排序。1.直接插入排序......
  • 选择排序(简单版)(LOW)
    博客地址:https://www.cnblogs.com/zylyehuo/#_*_coding:utf-8_*_defselect_sort_simple(li):li_new=[]foriinrange(len(li)):min_val=min(li)li_new.append(min_val)li.remove(min_val)returnli_newli=[3,4,2,1,5,6......
  • 选择排序(LOW)
    博客地址:https://www.cnblogs.com/zylyehuo/#_*_coding:utf-8_*_defselect_sort(li):foriinrange(len(li)-1):#i是第几趟min_loc=iforjinrange(i+1,len(li)):ifli[j]<li[min_loc]:min_loc=j......
  • Oracle-快速恢复区
    快速恢复区是一个磁盘目标,用作与恢复相关的文件的默认位置。可以使用两个实例参数对快速恢复区进行控制:db_recovery_file_destdb_recovery_file_dest_size第一个参数指定位置。这可以是文件系统目录或ASM磁盘组。多个数据库可以共享一个公共目标;在目标中,每个数据库都有各自自动创......
  • 冒泡排序(LOW)
    博客地址:https://www.cnblogs.com/zylyehuo/#_*_coding:utf-8_*_importrandomdefbubble_sort(li):foriinrange(len(li)-1):exchange=Falseforjinrange(len(li)-i-1):ifli[j]>li[j+1]:li[j],li[j+1......
  • WEB实战手册-基于C++(1)
    目录oat++oat++oat++是一个轻量级高性能Web服务开发框架,采用纯C++编写而成。特性:特性快速零依赖异步服务器,高性能,在单个服务器上同时处理超过500万个WebSocket连接多线程服务器(简单的API)连接无感知,可以使用任何传输类型,无论是SSL后端、套接字......