文档介绍:常见排序算法总结
1. 基本概念
排序:是将一组数据元素按某种特定要求(升或降序)排列成有规律序列的过程。
排序可以分为内部排序和外部排序两种:
1). 若整个排序过程不需要访问外存便能完成,则称此类排序为内部排序。
2). 若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,需要借助外存来完成,则称此类排序为外部排序。//不涉及内外存交换
就地排序:若排序算法所需的辅助空间并不依赖于问题的规模n,即辅助空间为O(1),则称为就地排序。
稳定性:假设在待排序的元素中,存在两个或两个以上的元素具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。
2. 常见内部排序
交换排序
交换排序的基本思想是两两比较待排序记录的关键字,若发生与排序要求相逆,则交换之,反复进行,直到数据有序。
交换排序的主要方法有:冒泡排序和快速排序。
1). 冒泡排序
a. 算法思想
已知一组无序数据元素P[n],需将按其关键字升序排列。
第一趟对n个元素冒泡得到一个关键字最大的元素P[n-1],第二趟冒泡对n-1个元素得到一个关键字最大的元素P[n-2],依次类推,直到数据有序。
b. 算法实现
void buble(int arr[], int n)
{
bool flag;//用于判断是否发生了交换
int i;
int temp;//临时变量
//反复多轮,从小到大排序。
do {
//一轮排序
flag = false;
//反复比较所有相邻的元素,循环比较n-1次。
for(i = 1; i < n; i++) {
//如果顺序不当,就交换他们。
if(arr[i] < arr[i - 1]) {
temp = arr[i];
arr[i] = arr[i - 1];
arr[i - 1] = temp;
//记录本轮已发生交换
flag = true;
}
}
n--;
}while(flag);//知道本轮没有发生交换,循环退出。
}
注:
冒泡排序算法是稳定的,时间复杂度是O(n^2)。
冒泡排序算法适合只有少量乱序的数据。
2). 快速排序
a. 算法思想
已知一组无序数据元素P[n],需将按其关键字升序排列。
首先任取一个元素P[x](通常选取首元素)作为基准,多次比较P[x]与其它元素并交换。
直到当P[x]可以排在序列的第k位,并且使P[0]~P[k]中的每一个元素小于P[x],P[k+1]~P[n-1]中的每一个元素不小于P[x]时,交换P[x]和P[k]。
再分别对P[0]~P[k-1]和P[k+1]~P[n-1]两组数据元素重复上述过程,直到数据有序。
b. 算法实现
//交换函数
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//快速排序
void qsort(int arr[], int n)
{
int temp;
int *L, *R;