1、插入排序
每次将待排记录插入到前面已经排好序的子序列,直到所有待排记录都插入。
1.1 直接插入排序
算法思想:n个待排元素分成一个有序表,一个无序表,初始时,有序表只包含一个元素,依次取无序表中的元素,与有序表中的元素比较,插入到有序表中合适的位置。
void insertsort(elemtype A[],int n){
/*待排序列A中的n个元素进行插入排序*/
int i,j;
for(i=2;i<n;i++){
A[0]=A[i];//A[0]是哨兵
for(j=i-1;A[j]>A[0];j--){
A[j+1]=A[j];
}//for
A[j]=A[0];
}//for
}
空间复杂度是1,时间复杂度是顺序时为n,逆序时为n平方。稳定。顺序表和链表均可使用。
1.2 希尔排序(缩小增量排序)
算法思想:先取一个小于n的步长d1,将待排序列间隔为d1的元素分为一组,一共分为d1组,组内进行直接插入排序,然后再取步长d2,且d2<d1,重复上述步骤,直到di=1,即所有元素放到一个表中进行排序,再进行一次直接插入排序即可。
void shellsort(elemtype a[],int n){
//a[0]用来存储临时变量,不是哨兵
int i,j,dk;
for(dk=n/2;dk>0;dk=dk/2){/增量变化
for(i=1+dk;i<n;i+=dk){
if(a[i]<a[i-dk]){
a[0]=a[i];//暂存待排元素
for(j=i-dk;j>0&&a[j]>a[0];j-=dk)
a[j+dk]=a[j];//记录后移
a[i-dk]=a[0];//插入
}//if
}//for
}//for
}
空间复杂度是1,时间复杂度是n的1.3-n平方,不稳定,适用于线性表。
2、选择排序
3、交换排序
4、归并排序