根据待排序的记录数量的不同可将排序方法分为内部排序和外部排序。
内部排序:指待排序记录存放在计算机随机存储器中进行的排序过程。(数据加载在内存中的排序)
外部排序:指待排序记录的数量很大,以致内存一次不能全部容纳全部记录,在排序过程中需对外存进行访问的排序过程。
下面我将罗列几个算法,希望朋友们能指出其中错误,互相交流。
#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;
}
希望发现问题的朋友联系我,交流学习。谢谢!