首页 > 其他分享 >温习快排

温习快排

时间:2023-02-13 16:24:19浏览次数:40  
标签:right num1 num2 int 快排 pivot 温习 left

一.我自己的做法

1.1 代码

#include<stdio.h>
void swap(int *num1,int *num2){
	int temp=*num1;
	*num1=*num2;
	*num2=temp;
}
int op(int a[],int left,int right){
	while(left<right){
		while(left<right){
			if(a[right]<a[left]){
				swap(&a[right],&a[left]);
				break;
			}
			else
				right--;
		}
		while(left<right){
			if(a[right]<a[left]){
				swap(&a[right],&a[left]);
				break;
			}
			else
				left++;
		}
	}
	return left;
}

void quickSort(int a[],int left,int right){
	int length=right-left;
	if(length<=1)
		return;
	int pos=op(a,left,right);
	quickSort(a,left,pos);
	quickSort(a,pos+1,right);
}

int main(){
	int a[100];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",a+i);
	quickSort(a,0,n-1);
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
}

1.2 测试

1.2.1 测试数据
9
2 1 3 1 5 4 6 2 3
1.2.2 结果

二.y总的模板

#include<iostream>

using namespace std;
const int N=100;

void swap(int *num1,int *num2){
	int temp=*num1;
	*num1=*num2;
	*num2=temp;
}

void quickSort(int a[],int left,int right){
	if(left>=right)	return;
	int pivot=a[left];
	int l=left-1;
	int r=right+1;
	while(l<r){
		do l++;while(pivot>a[l]);
		do r--;while(pivot<a[r]);
		if(l<r) swap(&a[l],&a[r]);
	}
	quickSort(a,left,r);
	quickSort(a,r+1,right);
}

int main(){
	int a[N];
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",a+i);
	quickSort(a,0,n-1);
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	return 0;
}

2.1注意边界问题

如果选用left做pivot,则递归时两个边界分别为r与r+1。
如果选用right做pivot,则递归时两个边界分别为l-1与l。
也就是对称。

标签:right,num1,num2,int,快排,pivot,温习,left
From: https://www.cnblogs.com/cony1/p/17116785.html

相关文章

  • 温习日志-14
    温习日志——2023年2月8日下午学习内容事件冒泡练习通过点击事件中函数参数的e.target就是所点击的具体元素,最终会一直向上传递,通过e.currentTarget获取最终的元素......
  • 温习日志-13
    温习日志——2023年2月6日下午学习内容InternationalizingDates(Intl)通过newIntl.DateTimeFormat('当地ISO码',可以对创建的对象具体格式化)创建对象,通过.format......
  • 温习日志-12
    温习日志——2023年2月1日下午学习内容转换和检查数字对于数字23和23.0是相等的0.1+0.2由于JS原因不等于0.3,而是0.300000000000004将字符串转换是Number('23')......
  • 温习日志-11
    温习日志——2023年1月31日下午学习内容奇妙的链式方法通过filter方法、map方法等等都会返回遍历后的新数组,所以可以使用链式写法练习3,详见于代码find方法find......
  • 温习日志-10
    温习日志——2023年1月30日下午学习内容简单数组方法通过arr.slice(开始截断索引,截断后一位索引)返回的是截断后的新数组如果slice中不放任何参数就是类似于浅拷贝......
  • 温习日志-9
    温习日志——2023年1月29日下午学习内容默认参数在ES5时,当检验函数中参数是否添加,并且添加默认值,需要用到||在ES6只需在函数中的参数直接等于默认参数,当调用时没有......
  • 温习日志-8
    温习日志——2023年1月28日下午学习内容Sets通过newSet(可迭代对象)创建setset集合会将数组中重复项删除,保证都是唯一值set接受可迭代对象,就算是字符串也行set方......
  • 温习日志-7
    温习日志——2023年1月14日下午b站学习地址学习内容解构数组通过const[a,b,c]=arr可以将arr数组的前三个值根据位置赋值也可以通过const[a,b,,c]=arr......
  • 温习日志-6
    温习日志——2023年1月16日下午b站学习地址学习内容JS高阶总览JS的引擎和运行时间JS知名的引擎有Chrome的V8、火狐的spiderMonkey等等JS的引擎有调用栈和堆JS是......
  • 温习日志-5
    温习日志——2023年1月17日深夜学习内容H5C3基础什么是DOMDOM是文件对象模型我们可以获取DOM节点进行操作项目#1_猜数迷获取元素,document.querySelector()......