排序算法初探

发现自己根本不会写排序,于是去复习了几个排序算法...

最坏O(n^2)的算法

冒泡排序

维护一个形如[无序区,有序区]的序列,每次通过交换相邻元素,把无序区里最大的元素移到有序区的前端。

选择排序

维护一个形如[有序区,无序区]的序列,每次从无序区里选择出最小的元素,放到有序区的后面。

插入排序

维护一个形如[有序区,无序区]的序列,每次把无序区里的第一个元素插入到有序区里合适的位置。

快速排序

随机选一个元素,将比该元素小的元素移到它的前面,比它大的移到后面。再对前后两个区间递归进行相同操作。对于随机数据,算法效率似乎甚至优于归并排序。同时代码实现时可以使用简洁但不好理解的swap两个元素的方法。

#include<bits/stdc++.h>
using namespace std;
const int SIZE=100005;

#define Mid ((L+R)>>1)
void Quick_Sort(int L,int R,int A[])
{
	if(R<=L)return;
	int Flag=A[(L+R)/2],p=L,q=R;
	while(p<=q)
	{
		while(A[p]<Flag)p++;
		while(A[q]>Flag)q--;
		if(p<=q)swap(A[p++],A[q--]);
	}
	Quick_Sort(L,q,A);
	Quick_Sort(p,R,A);
}

int main()
{
	int n,A[SIZE];
	cin>>n;
	for(int i=1;i<=n;i++)cin>>A[i];
	Quick_Sort(1,n,A);
	for(int i=1;i<=n;i++)cout<<A[i]<<" ";
	return 0;
}

其他比较有意思的算法

归并排序

时间复杂度为稳定的 (O(nlog n))

#include<bits/stdc++.h>
using namespace std;
const int SIZE=100005;

#define Mid ((L+R)>>1)
void Merge_Sort(int L,int R,int A[],int Tem[])
{
	if(L==R)return;
	Merge_Sort(L,Mid,A,Tem);
	Merge_Sort(Mid+1,R,A,Tem);
	int i=L,j=Mid+1,k=L-1;
	while(i<=Mid&&j<=R)
	{
		if(A[i]<=A[j]) Tem[++k]=A[i++];
		else Tem[++k]=A[j++];
	}
	while(i<=Mid)Tem[++k]=A[i++];
	while(j<=R)Tem[++k]=A[j++];
	for(i=L;i<=R;i++)A[i]=Tem[i];
}

int main()
{
	int n,A[SIZE],Tem[SIZE];
	cin>>n;
	for(int i=1;i<=n;i++) cin>>A[i];
	Merge_Sort(1,n,A,Tem);
	for(int i=1;i<=n;i++)cout<<A[i]<<" ";
	return 0;
}

桶排序

好像也很有意思。

原文地址:https://www.cnblogs.com/TaylorSwift13/p/15530410.html