1.冒泡排序
一种交换排序;基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
平均时间复杂度O(n*n);最好O(n);最坏O(n*n)
void BubbleSort (SqList *L) %较小的数字如同气泡般慢慢浮到上面
{
int i,j;
for (i=1;i<L->length;i++)
{
for(j=L->length-1;j>=i;j--)
{
if (L->r[j]>L->r[j+1])
{
swap(L,j,j+1);
}
}
}
}
2.简单选择排序
通过 n-i 次关键字间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第 i (1≤i≤n) 个记录交换。
最好、最坏、平均时间复杂度O(n*n)
3.直接插入排序
将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
平均时间复杂度O(n*n);最好O(n);最坏O(n*n)
4.堆排序
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
堆排序(假设利用大顶堆)的基本思想:将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个序列重新构造成一个堆,这样就会得到 n 个元素中的次大值。如此反复执行,便能得到一个有序序列了。
堆排序的最好、最坏和平均时间复杂度均为O(nlogn);不适合带排序序列个数较少的情况
5.希尔排序
6.归并排序
假设初始序列含有n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到【n/2】个长度为2或1的有序子序列;再两两归并,......,如此反复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。
最好、最坏、平均时间复杂度O(nlogn)
7.快速排序
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序的目的。
最好、平均O(nlogn);最坏O(n^2)