直插,折半,二路,希尔排序

根据待排序的记录数量的不同可将排序方法分为内部排序外部排序。

内部排序:指待排序记录存放在计算机随机存储器中进行的排序过程。(数据加载在内存中的排序)

外部排序:指待排序记录的数量很大,以致内存一次不能全部容纳全部记录,在排序过程中需对外存进行访问的排序过程。

下面我将罗列几个算法,希望朋友们能指出其中错误,互相交流。

#include<iostream>
using namespace std;
#define SIZE_OF 21

typedef int SqList[SIZE_OF];


方法一:直接插入排序,时间复杂度为O(N^2).算法:

//直接插入排序
void InsertSort(SqList &L,int n)
{
	for(int i=2;i<n;++i)
		if(L[i]<L[i-1])
		{
			L[0]=L[i];
			int j=0;
			for(j=i-1;L[j]>L[0];--j)
			{
				L[j+1]=L[j];//向后移位
			}
				L[j+1]=L[0];//插入数据
		}
}
运行结果如下:


方法2:折半插入排序,时间复杂度还是O(N^2)与直接插入排序相比,只是减少了数值间的比次数,移动次数不变。算法:

void BInsertSort(SqList &L,int n)//折半插入排序
{
	for(int i=2;i<n;++i)
	{
		L[0]=L[i];
		int high=i-1;
		int low=1;
		while(low<=high)
		{
			int m=(high+low)/2;
			if(L[0]>L[m])
				low=m+1;
			else
				high=m-1;
		}
		for(int j=i-1;j>high+1;--j)
		{
			L[j+1]=L[j];
		}
		L[high+1]=L[0];
	}

	

}
结果如下:


方法三:2-路插入排序,其目的是减少排序过程中的移动记录的次数,但为此需要n个记录空间,算法如下:

void Tway(SqList &L,int n)//2-路插入排序
{
	SqList M;
	M[0]=L[0];
	int first,last;
	first=last=0;
	for(int i=1;i<n;++i)
	{
		if(L[i]<M[first])
		{
			first=(first-1+n)%n;
			M[first]=L[i];
		}
		else if(L[i]>M[last])
		{
			last++;
			M[last]=L[i];
		}
		else
		{
			last++;
			M[last]=M[last-1];
			int j;
			for(j=last-1;L[i]<M[(j-1+n)%n];j=(j-1+n)%n)
			{
				M[j]=M[(j-1+n)%n];
			}
			    M[j]=L[i];
			 
		}


	}
	for(int i=0;i<n;++i)
	{
		L[i]=M[first];
		first=(first+1)%n;
	}

}
结果如下:


方法四:希尔排序,算法如下:

int main()
{
	SqList T={0,49,38,65,97,76,13,27,49};

	for(int i=0;i<9;++i)
	{
		cout<<T[i]<<" ";
	}
	cout<<endl;
	InsertSort(T,9);
	BInsertSort(T,9);
	Shellsort(T,a,4);
	Tway(T,9);
	for(int i=1;i<9;++i)
	{
		cout<<T[i]<<" ";
	}
	return 0;

}

希望发现问题的朋友联系我,交流学习。谢谢!

你可能感兴趣的:(算法,希尔排序,插入排序)