排序

5 篇文章 0 订阅
4 篇文章 0 订阅

排序算法

问题

给定n个整数序列<a1,a2,…,an>,输出该序列的一个排列 <a1’,a2’,…,an’>,满足a1’<=a2’<=…<=an’。

快速排序

利用分治和二分的思想 选择一第1个元素为哨兵, 从2和N开始比较,若a[i]<a[1] a[j]>a[0] 两个交换,进行之后进行二分依次递归

#include<iostream>

using namespace std;

int a[100];

void swap(int a[], int i, int j){
	
	int s = a[i];
	a[i] = a[j];
	a[j] = s;
	
}

void QuickSort(int a[], int l, int r){
	
	if(l>=r)	return;
	
	int mid = a[l];
	int i = l+1, j = r;
	
	while(i<=j){ 
		while(a[i]<mid && i<=r)
		i++;
		while(a[j]>mid)
		j--;
		
		if(i<j)
		swap(a, i, j);
	} 
	
//	while(1){ 
//		while(a[i]<=mid && i<=r)
//		i++;
//		while(a[j]>=mid && j>l)
//		j--;
//		if(i>=j) break;
//		
//		swap(a, i, j);
//	} 

	swap(a, l, j);
	
	QuickSort(a, l, j);
	QuickSort(a, j+1, r);
	
}

int main(){
	
	int N;
	cin>>N;
	
	for(int i=1; i<=N; i++)
		cin>>a[i];
//	for(int i=1; i<=N; i++)
//		cout<<a[i]<<" ";

	QuickSort(a, 1, N);
	
	for(int i=1; i<=N; i++)
		cout<<a[i]<<" ";
	
	return 0;
}
归并排序

利用分治和二分,先对两个进行排序,在部分排序之后再对整体排序

#include <iostream>

using namespace std;

int a[10000] = {};
int b[10000];

void Copy(int a[], int b[], int l, int r){
	
	for(int i=l; i<=r; i++)
	a[i] = b[i];
	
}

void Merge(int a[], int l, int r, int mid){
	
	int L[mid-l+2];
	int R[r-mid+2];
	int q = 1, p = 1; 
	for(int i=l; i<=mid; i++){
		L[q++] = a[i];
	} 
	for(int i=mid+1; i<=r; i++){
		R[p++] = a[i];
	}
	
	L[q] = 100000;
	R[p] = 100000;
	
	int o = l;
	int m = 1,n = 1;
	while(m<=q || n<=p){
		if(L[m]<=R[n]){
			b[o++] = L[m];
			m++;
		}
		else {
			b[o++] = R[n];
			n++;
		}
	}
	
	Copy(a, b, l,r);
	
}

void MergeSort(int a[], int l, int r){
	
	if(l<r){
		int mid = (l+r)/2;
		MergeSort(a, l, mid);
		MergeSort(a, mid+1, r);
		Merge(a, l, r, mid);
		Copy(a, b, l, r);
	} 
	
} 

int main(){
	int N;
	
	cin>>N;
	
	for(int i=1; i<=N; i++){
		cin>>a[i];
		//b[i] = a[i];
	}

	MergeSort(a, 0, N);
	
	for(int i=1; i<=N; i++)
	cout<<a[i]<<" ";
	
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值