十种常见排序算法可以分为两大类:
- 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
- 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

冒泡排序
基本思路
两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止
算法描述
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
实现代码:
#include <stdio.h>
void BubbleSort(int *t)//冒泡排序
{
int i,j;//两个变量,一个用于外层循环,一个用于内层循环
int flag =1;//冒泡排序的改进
for(i=0;i<9&&flag;i++)//循环次数比数组大小少1
{
flag=0;
for(j=9;j>i;j--)//从结尾处向前开始循环,i次循环后前i位便不用进行比较
{
if(t[j-1]>t[j])//前者大于后者则交换
{
int x;
x=t[j];
t[j]=t[j-1];
t[j-1]=x;
flag=1;
}
}
}
}
分析
时间复杂度,最坏O(n^2),最好O(n),稳定的
快速排序
基本思路
通过一趟排序将待排记录分别分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分进行记录继续进行排序,以达到整个序列有序的目的
算法描述
快速排序使用分治法来把一个串分为两个子串。
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。