- 插入排序
插入排序保证位置0到位置P上的元素为已排序状态。
先把j位置的值取出,然后比较j与j-1的大小,如果j>j-1,则,j位置就为原值,否则j位置就为j-1的值,循环将j减1,再比较当前位置与前一位置值得大小,如果当前位置大于前一位置的值,则将第一步取出的j值,放在当前位置,否则重复前面的操作直至j = 1的时候结束操作。
void InsertionSort(ElementType A[],int N)
{
int j,P;
for(P =1;P<N;P++)
{
temp = A[P];
for(j = P;j>0&A[j-1]>Temp;j--)
A[j ] = A[j-1];
A[j] = temp;
}
}
- 希尔排序
希尔排序使用一个序列h1,h2,h3…ht,叫做增量序列。只要h1= 1,任和增量都是可行的。
在使用增量hk的一趟排序之后,对于每一个i我们有A[i]<A[i+hk];所有相隔hk的元素都被排序。此时称文件是hk-排序的。
例程(插入排序法的扩展情况)
void ShellSort(element A,int N)
{
int i,j,Increment;
element tmp;
for(Increment = N/2;Incerment >0;Increment/=2)
for(i = Increment;i<N;i++)
{
tmp = a[i];
for(j = i;j>= Increment;j-=Increment )
if (tmp<A[j-Increment])
A[j] = a[j-Increment];
else
break;
A[j] = tmp;
}
}
- 堆排序
优先队列可以用于花费O(NlogN)时间排序。基于该想法的算法叫做堆排序。
建立二叉堆
执行N次DeleteMin操作,排序 - 归并排序
合并两个已排序的表 - 快速排序
如果S中元素个数为0或1,则返回
取S中任一元素V,称之为枢纽元(pivot)
将S-{v}分为两个子集,S1,S2
返回{quicksort(S1)}后,继随v,继而quicksort(s2)} - 桶式排序
- 外部排序
目前为止,大部分的排序算法都用到内存可寻址的事实。希尔排序用一个时间单元比较元素A[i]和A[i-hk]…如果输入数据在磁带上,那么所有这些操作就失去了它们的效率,因为磁带上的元素只能够被顺序访问。
各种各样的海量存储使得外部排序比内部排序对设备的依赖性要严重的多,于是考虑一些算法在磁带上工作。