当前位置:   article > 正文

基础算法 ---- 快速排序和归并排序_给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,

给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,

快速排序

分治思想

  1. 确定分界点X:初值,末值,中间值,随机一个值
  2. 调整区间:将小于等于X的数全部在X的左边,大于等于X的数全部在X的右边
  3. 递归处理:分别递归左边区间和右边区间

调整区间

用两个指针分别从初值和末值开始往中间走,当碰到左边碰到大于等于X的值左指针停下,当右边碰到小于等于X的值右指针停下,将左右数值交换,重复上述操作,当左指针移动到右指针右侧后结束递归。

模板代码如下 :

void quick_sort(int a[],int l,int r)
{
	if(l>=r) return ;
	int x=a[(l+r+1)/2],i=l-1,j=r+1;
	//x取中间值(向上取整) 
	while(i<j){
		do{
			i++;
		}while(a[i]<x);
		do{
			j--;
		}while(a[j]>x);
		if(i<j) swap(a[i],a[j]);
	} 
	quick_sort(a,l,i-1);
	quick_sort(a,i,r);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

归并排序

  1. 确定分界点:下标的中间值
  2. 递归排序左右区间
  3. 归并:合二为一

归并

用两个指针分别从两个区间的开始位置移动,同时比较两个指针所指数值的大小,将两个数值较小的一个放到一个新的数组中,当其中一个指针到达数组的末位置,结束递归。

图解
在这里插入图片描述
在这里插入图片描述

模板代码如下:

void merge_sort(int a[],int l,int r)
{
	if(l>=r) return ;
	int mid=(l+r)/2;
	merge_sort(a,l,mid);
	merge_sort(a,mid+1,r);
	int k=0,i=l,j=mid+1;
	while(i<=mid&&j<=r){
		if(a[i]<=a[j]){
			tmp[k++]=a[i++];
		}
		else{
			tmp[k++]=a[j++];
		}
	}
	while(i<=mid){
		tmp[k++]=a[i++];
	}
	while(j<=r){
		tmp[k++]=a[j++];
	}
	for(int i=l,j=0;i<=r;i++,j++){
		a[i]=tmp[j];
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

排序

给定你一个长度为n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。

输出格式

输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1≤n≤100000

5
3 1 2 4 5
  • 1
  • 2
1 2 3 4 5
  • 1

快速代码如下 :

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int N=110000;
int a[N];
void quick_sort(int a[],int l,int r)
{
	if(l>=r) return ;
	int x=a[(l+r+1)/2],i=l-1,j=r+1;
	//x取中间值(向上取整) 
	while(i<j){
		do{
			i++;
		}while(a[i]<x);
		do{
			j--;
		}while(a[j]>x);
		if(i<j) swap(a[i],a[j]);
	} 
	quick_sort(a,l,i-1);
	quick_sort(a,i,r);
}
int main()
{
//	cin>>n;          
	scanf("%d",&n); 
	for(int i=0;i<n;i++){
//		cin>>a[i];
		scanf("%d",&a[i]);
	} 
	quick_sort(a,0,n-1);
	for(int i=0;i<n;i++){
//		cout<<a[i]<<" ";
		printf("%d ",a[i]);
	}
	return 0;
 } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

归并代码如下 :

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int N=110000;
int a[N];
int tmp[N];
void merge_sort(int a[],int l,int r)
{
	if(l>=r) return ;
	int mid=(l+r)/2;
	merge_sort(a,l,mid);
	merge_sort(a,mid+1,r);
	int k=0,i=l,j=mid+1;
	while(i<=mid&&j<=r){
		if(a[i]<=a[j]){
			tmp[k++]=a[i++];
		}
		else{
			tmp[k++]=a[j++];
		}
	}
	while(i<=mid){
		tmp[k++]=a[i++];
	}
	while(j<=r){
		tmp[k++]=a[j++];
	}
	for(int i=l,j=0;i<=r;i++,j++){
		a[i]=tmp[j];
	}
}
int main()
{
//	cin>>n;          
	scanf("%d",&n); 
	for(int i=0;i<n;i++){
//		cin>>a[i];
		scanf("%d",&a[i]);
	} 
	merge_sort(a,0,n-1);
	for(int i=0;i<n;i++){
//		cout<<a[i]<<" ";
		printf("%d ",tmp[i]);
	}
	return 0;
 } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/703531
推荐阅读
相关标签
  

闽ICP备14008679号