排序
影响排序算法性能的要素
- 时间性能
- 辅助空间
- 算法复杂性
冒泡排序
两两相邻的关键字,若反序则交换,直到没有反序的记录为止。
两层循环
for (i=0; i<n-1; i++)
{
for (j=n-1; j >i ; j--)
{
if (k[j-1] > k[j])
{
temp = k[j-1];
k[j-1] = k[j];
k[j] = temp;
}
}
}
O(n.^2)
选择排序
通过 n-i 次关键词间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第 i 个记录交换。
O(n.^2)
for (i=0; i<n-1; i++)
{
min = i;
for (j=i+1; j < n ; j++)
{
if (k[j] < k[min])
{
min = j;
}
}
if (min != i)
{
temp = k[min];
k[min] = k[i];
k[i] = temp;
}
}
直接插入
for (i=1; i<n; i++)
{
if (k[i] < k[i-1] )
{
temp=k[i];
for (j=i-1; k[j] > temp ; j--)
{
k[j+1] = k[j];
}
k[j+1] = temp;
}
}
O(n.^2)
在基本有序、记录数少的情况下,效率较高
希尔排序
对直接插入排序增加不同跨度
堆排序
Heap Sort
①将待排序列构造成大顶堆(小顶堆)
②此时序列最大值就是堆顶的根结点,将它移走(与末尾元素交换)
③将剩余n-1个序列重新构造一个堆
④反复执行
归并排序
假设初始序列有n个记录,可以看成n个有序的子序列,每个子序列长度为1,然后两两归并,得到 ceiling(n/2) 个长度为2或1的有序子序列,再两两归并,不断重复,这是2路归并排序。
可用迭代或递归实现