啊哈!算法 第1章 一大波数正在靠近——排序

一、冒泡排序

1.      冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来

2.      每次都是比较相邻的两个数,如果后面的数比前面的数大,则交换这两个数的位置。第一趟直到最后两个数比较完毕后,最小的数就在最后一个了,也就是将最小的数归 位了。第二趟将第二小的数归位。

3.      每一趟只能确定将一个数归位。如果有n个数进行排序,只需将n-1个数归位,也就是进行n-1趟操作。每一趟都需要从第1位进行相邻两个数的比较,将较小的一个数放在 后面,直到最后一个尚未归位的数

4.      冒泡排序的核心部分是双重嵌套循环

#include <iostream>
using namespace std;
int main(){
	int a[100],i,j,n,t;
	cin>>n;
	for(i=0;i!=n;i++)
		cin>>a[i];
	for(i=0;i<=n-2;i++)
		for(j=0;j<=n-2;j++){
			if(a[j]<a[j+1]){
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	for(i=0;i!=n;i++)
		cout<<a[i]<<" ";
	return 0;
}





二、快速排序

1.      快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。

2.      该方法的关键在于切分:

a)        对于某个j,a[j]已经排定

b)        a[lo]到a[j-1]中的所有元素都不大于a[j]

c)        a[j+1]到a[hi]中的所有元素都不小于a[j]

3.      随意取a[lo]作为切分元素。从数组的左端开始向右扫描直到找到一个大于等于它的元素,再从数组的右端开始向左扫描直到找到一个小于等于它的元素,交换它们的位 置,以此保证左指针i的左侧元素都不大于切分元素,右指针j的右侧元素都不小于切分元素。当两个指针相遇,将切分元素a[lo]和左子数组最右侧的元素交换然后返回j即可

#include <iostream>
using namespace std;
int a[101],i,j,n,temp,t;
void quicksort(int left,int right){
	if(left>=right)
		return;
	
	i=left;
	j=right;
	t=a[left];
	
	while(i!=j){
		while(a[j]>=t&&i<j)
			j--;
		while(a[i]<=t&&i<j)
			i++;
		if(i<j){
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
	}
	
	a[left]=a[i];
	a[i]=t;
	
	quicksort(left,i-1);
	quicksort(i+1,right);
	return;
}

int main(){
	cin>>n;
	for(int k=0;k!=n;k++)
		cin>>a[k];
	quicksort(0,n-1);
	for(int l=0;l!=n;l++)
		cout<<a[l]<<" ";
	return 0;
}













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值