9.排序
插入排序算法:直接插入排序、折半查找排序、希尔排序
交换排序算法:冒泡排序、快速排序
选择排序算法:简单选择排序、堆排序
归并排序算法:
基数排序算法:
各算法性能对比:
直接插入排序
基本思想:从下标为1的元素(38)开始,依次同前面的元素比较,若小于前元素,便交换位置
部分示例:
直接插入排序(不带哨兵)
.
void InsertSort(int A[],int n){
int i,j;
// 遍历整个数组
for(i=1; i<=n; i++){
if(A[i] < A[i-1]){
// 将A[i]暂存到temp
temp = A[i];
// 依次往前遍历当前指向元素前的子表
for(j=i-1; j>=0 && temp < A[j]; --j){
// 将所有A[j]元素往后移一位
A[j+1] = A[j];
}
A[j+1] = temp;
}
}
}
直接插入排序(带哨兵)
.
void InsertSort(int A[], int n);{
int i,j;
// 插入排序外层遍历
for (i = 2; i <= n; i++){
// 找合适的插入位置
if(A[i] < A[i-1]){
// 将A[i]暂存到哨兵
A[0] = A[i]
// 从后往前遍历找到第一个小于等于A[i]的元素下标
for(j = i-1; A[0] < A[j]; --j){
A[j+1] = A[j];
}
// 将A[0]插入到第一个小于等于A[i]元素的后一位
A[j+1] = A[0];
}
}
}
算法性能:
时间复杂度: 最好情况:O(n) ; 最坏情况:O(n²) ;平均情况:O(n²)
空间复杂度:O(1)
稳定性:稳定
希尔排序
基本思想: 将待排序表分成若干"特殊"子表,对每个子表分别进行直接插入排序,慢慢缩小增量d,重复过程,直到d=1为止。
部分示例:
d=4,每隔4个元素将其合成子表,在子表中进行直接插入排序
d=d/2,下一次d=2
部分示例:
相关代码
.
void ShellSort(ElemType A[],int n){
// d表示增量
// d1=n/2,di+1=[di/2],直到最后一个增量为1
for(int d=n/2; d>=1; d=d/2){
// 依次遍历每个子表
for(int i=d+1; i<=n; ++i){
// 如果前面有序子表最后一位(A[i-d])比当前需要调整位置的(A[i])key大
// 则需要找到A[i]应该插入的位置
if(A[i] < A[i-d]){
// 将元素暂存到A[0]
// 将A[i]插入到应该插入的位置(类似前面直接插入排序找插入位置)
A[0] = A[i];
for(j = j-d; j > 0 && A[0] <A[j]; j-=d){
A[j+d] = A[j];
}
A[j+d] = 0;
}
}
}
}
算法性能:
时间复杂度: 最好情况:O(n) ; 最坏情况:O(n²) ;平均情况:O(n的1.3次方)
空间复杂度:O(1)
稳定性:不稳定
总结表格: