复习排序算法

备战acm校队第二天。
实惨,排序学了好几年了,还是没有熟练,意难平啊。特此打开oi-wiki,从头到尾把排序敲一遍。

选择排序
比较简单。就是把数组里最大数找出来放到最后,然后再把第二大的找出来放在倒数第二位,依次类推,排序就结束了。
注:TMD,Dev-C++原来不能把中文注释在代码,不然拷贝出来会乱码。所以选择排序我不注释了

点击查看代码
#include<bits/stdc++.h> 
int a[100005],n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i=n;i>=1;--i)
	{
		for(int j=1;j<=i;j++)
		{
			if(a[j]>a[i]) swap(a[j],a[i]); 
		}
	}
	for(int i=1;i<=n;++i)
	{
		printf("%d ",a[i]);
	}
}

冒泡排序
每一个位置的数都与后面的数比较,只要后面小于前面,就交换,保持单调递增。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int a[100005],n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n-1;++j)
		{
			if(a[j]>a[j+1]) swap(a[j],a[j+1]); 
		}
	}/*每一次操作都能保证未被排序中最大的数被交换到最后一位(相对最后一位)*/
	for(int i=1;i<=n;++i)
	{
		printf("%d ",a[i]);
	}
}

插入排序
以把小的往前插为例:每当找到小的数,就把这个数存下来,然后把这个数前面比它大的往后移,空出一个位置放入这个数。如果没有比它大的,也就没法移动了。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int a[100005],n;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;++i)
	{
		int k=a[i];
		int j=i-1;
		while(j>=0&&a[j]>k)//移动过程
		{
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=k;
	}
	for(int i=1;i<=n;++i)
	{
		printf("%d ",a[i]);
	}
}

选择排序
随便找一个数x,从左到右找一个比x大的数,然后再从右往左找一个比x小的数,如果不满足递增则交换,重复多次直至左边超过右边。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int a[10005],n;
void quicksort(int l,int r)
{
	int mid=a[l+r>>1];
	int i=l,j=r;
	do
	{
		while(a[i]<mid) i++;
		while(mid<a[j]) j--;
		if(i<=j)
		{
			swap(a[i],a[j]);
			i++;
			j--;
		}
	}while(i<=j);
	if(l<j) quicksort(l,j);
	if(i<r) quicksort(i,r);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	quicksort(1,n);
	for(int i=1;i<=n;i++)
	{
		printf("%d ",a[i]);
	}
}

我累了,还有的排序明天再说吧。

posted @ 2024-09-11 16:56  Fire_Colder  阅读(30)  评论(0)    收藏  举报