首页 > 其他分享 >排序

排序

时间:2023-01-03 16:11:07浏览次数:36  
标签:int quicksort mid while 数组 排序

Ⅰ. 排序

一. quicksort

1. 手敲

点击查看代码

void quicksort(int q[],int l,int r){
    
    //递归终止的情况
    if(l>=r)return;
    
    //子问题处理
    int mid=q[l+r>>1],i=l-1,j=r+1;   //quicksort中的mid为数而不是下标
     //>>1速度比/2更快			//取中值比取随机值更快,且能防止因为边界问题导致死循环
    
    while(i<j){         //不需要=,i==j便停止     
        do i++;while(q[i]<mid);   //=mid时也停止可以有效防止越界(需要理解这点)
        do j--;while(q[j]>mid); //该操作使i,j交点处左边的数均小于mid,右边的数均大于mid
        if(i<j)swap(a[i],a[j]);   //大于等于时不用交换
    }
    
    //递归处理子问题
    quicksort(q,l,j),quicksort(q,j+1,r);   //i不一定==j
}

//注l,r相邻时,意qsort(l,r)不能分治为qsort(l,r)否则会死循环
//(l+r)>>1 =l
//quicksort(q,l,l),quicksort(q,r,r);   //正确
//quicksort(q,l,i),quicksort(q,i+1,r);   -->  quicksort(q,l,r),quicksort(q,r+1,r);错误
点击查看代码

void qsort1(int a[],int l,int r){
	if(l >= r)return ;
	int mid = a[l + r >> 1],i = l - 1, j = r + 1;  		//int mid = a[l + r + 1>> 1]
	while(i < j){
		do i ++;while(a[i] < mid);
		do j --;while(a[j] > mid);
		if(i < j)swap(a[i],a[j]);
	}
	qsort1(a,l,j),qsort1(a,j + 1,r);   		//qsort1(a,l,i),qsort1(a,i + 1,r);
}"排序后(从小到大)"
void qsort2(int a[],int l,int r){
	if(l >= r)return ;
	int mid = a[l + r >> 1],i = l - 1, j = r + 1;
	while(i < j){
		do i ++;while(a[i] > mid);   //符号相反 
		do j --;while(a[j] < mid);
		if(i < j)swap(a[i],a[j]);
	}
	qsort2(a,l,j),qsort2(a,j + 1,r);
}"排序后(从小到大)"

bool cmp(int a,int b){
	return a > b;
}

"排序后(从小到大):  "	sort(a,a+n);   //qsort1(a,a,n);   
"排序后(从小到大):  "	sort(a,a+n,cmp);   //qsort2(a,a,n);

总结快排思路

  1. 有数组 \(q\), 左端点 \(l\), 右端点\(r\)

  2. 确定划分边界 \(x\)

  3. 将 \(q\) 分为 \(<=x\) 和 \(>=x\) 的两个小数组

\(i\)的含义: \(i\) 之前的元素都 \(≤x\), 即 \(q[l..i−1]≤x\)

\(j\) 的含义:\(j\)之后的元素都 \(≥x\), 即 \(q[j+1..r]≥x\)

结论: while 循环结束后, \(q[l..j] ≤x,q,q[j+1..r] ≥x\)
简单不严谨证明

while 循环结束时, \(i≥j\)
若 \(i>j\), 显然成立

若 \(i=j\)

∵ 最后一轮循环中两个 do−while 循环条件都不成立

∴ \(q[i]≥x,q[j]≤x\)

∴ \(q[i]=q[j]=x\)

∴ 结论成立

4.递归处理两个小数组

2. sort

二. mergesort

点击查看代码
void mergesort(int q[],int l,int r){
    //递归的终止情况
    if(l>=r)return;    //相等就不用再排序啦
    
    //第一步:分成子问题
    int mid=l+r>>1;
    
    //第二步:递归处理子问题
    mergesort(q,l,mid),mergesort(q,mid+1,r);  //分治
    
    //第三步:合并子问题
    int k=0,i=l,j=mid+1;
    while(i<=mid&&j<=r){    //=压入最后一个元素
        if(q[i]<=q[j])temp[k++]=q[i++];         //一般第一短优先,大于时从大到小排序,小于号时从小到大排序
        else temp[k++]=a[j++];
    }
    while(i<=mid)temp[k++]=q[i++];
    while(j<=r)temp[k++]=q[j++];     //另一端末端
    
    for(int i=l,k=0;i<=r;i++)q[i]=temp[k++];   //返回原数组
}

//注意temp如果在函数中定义的话不要t[N]

总结归并思路

  1. 有数组 \(q\), 左端点 \(l\), 右端点 \(r\)

  2. 确定划分边界 \(mid\)

  3. 递归处理子问题 \(q[l..mid], q[mid+1..r]\)

  4. 合并子问题

① 主体合并

至少有一个小数组添加到 \(tmp\) 数组中

② 收尾

可能存在的剩下的一个小数组的尾部直接添加到 \(tmp\) 数组中

③ 复制回来

\(tmp\) 数组覆盖原数组

标签:int,quicksort,mid,while,数组,排序
From: https://www.cnblogs.com/J-12045/p/17022544.html

相关文章

  • 排序算法
    选择排序选择排序(Selectionsort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续......
  • 冒泡排序
    1.1冒泡排序分类 算法冒泡排序(BubbleSort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列......
  • 冒泡排序
    #include<stdio.h>intBubbleSort(intA[],intn){//输入:数组A,元素数目n//输出:数组A中元素完成从小到大排序inti,j,x;for(i=0;i<n-......
  • 数组中的元素排序和去重总结
    一、使用List来操作publicclassArraySort{publicstaticvoidmain(String[]args){//定义一个数组Integer[]str={1,3,66,4,78,55,9,4,3,99};//将数......
  • 数组的排序
    一、选择排序图例:选择排序我们可以将它看做是"大圈套小圈代码:classArraySort{publicstaticvoidsort(intarr[]){for(inti=0;i<arr.length......
  • 冒泡排序
    冒泡排序冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!八大排序:冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序、基数排序。冒泡的代码还......
  • 排序——蓝桥(简单)
    题目描述例如,对于字符串 lanlan 排序,只需要 11 次交换。对于字符串 qiaoqiao 排序,总共需要 44 次交换。小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要......
  • 常见排序算法
    1、冒泡排序classSolution{public:stringminNumber(vector<int>&nums){intlen=nums.size();for(inti=0;i<len-1;i++){......
  • 使用lambda表达式实现sort的自定义排序
    使用lambda表达式实现sort的自定义排序(C++andJava)首先大致讲一下什么是lambda表达式你也可以将它就当做是匿名函数,lambda表达式其实就是匿名函数演化出的一种语法系统......
  • [Hive排序]--4种排序方式介绍
    一、官方文档​​Home-ApacheHive-ApacheSoftwareFoundation​​​​LanguageManual-ApacheHive-ApacheSoftwareFoundation​​​​LanguageManualSortBy-......