排序的定义:计算机设计中的一种重要操作,它的功能是将一个数据元素的任意排序,重新排列成一个按关键字有序的序列
假设含n个记录(条件)的序列为
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
其他相应关键字的序列为
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
这里K1为1? Kn为n从小到大有记录顺序的排序,所以需要让他们满足下列关系排序:
? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ??
排序稳定性:
按照存储器不同
分为:外部排序、内部排序
按照相同关键字排序前后的位置
分为:稳定排序、不稳定排序。例如:{3,4,2,3,1}
简单的排序方法,时间复杂度:O()
先进的排序方法,时间复杂度:O()
基数排序,时间复杂度:O()
将整个插入的数分成两个部分,前面已经排好的是有序的,后面是无序的,整个过程就是将无须的变成有序的过程。
直接插入排序关键字为n,最多或者最少为n-1,时间复杂度为,空间复杂度为
算法为:
void InsertSort(SqList &L)
{
? ? int i,j;
? ? for(i=2;i<=L.length;i++){
? ? ? ? if(L.r[i].key < L.r[i-1].key)
? ? ? ? {
? ? ? ? ? ? L.r [0] = L.r[i];
? ? ? ? ? ? L.r [i] = L.r[i-1];//哨兵
? ? ? ? ? ? for(j=i-2;L.r[0].key < L.r[j].key ; j--)
? ? ? ? ? ? ? ? L.r [j+1]=L.r[j];
? ? ? ? ? ? L.r [j+1]=L.r[0];
? ? ? ? }
? ? }
}
low mid high ,方式和折半查找类似
起泡排序:使关键字最大的记录被安置到最后一个记录的位置上,然后进行第二趟起泡排序,对前n-1个记录进行同样操作
总时间复杂度:
可选第一个记录作为枢纽
在每一趟记录中选取最小的记录作为有序序列中的第i个记录