前言
排序是程序设计中常做的操作,初学者往往只知道冒泡排序算法,其实还有很多效率更高的排序算法,比如希尔排序、快速排序、基数排序、归并排序等。
不同的排序算法,适用于不同的场景,本章最后从时间性能,算法稳定性等方面,分析各种排序算法。
排序算法,还分为内部排序算法和外部排序算法,之间的区别是,前者在内存中完成排序,而后者则需要借助外部存储器。
一、快速排序是什么?
快速排序算法是在起泡排序的基础上进行改进的一种算法,其实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就成为了有序序列。
二、使用方法
#include <stdio.h>
#include <stdlib.h>
#define N 15
// function module
int Partition(int *data, int low, int high);
int QuickSort(int *data, int low, int high);
int compare(const void *p1, const void *p2);
int main(int argc, char *argv[])
{
int i, data[N] = {0};
srandom(10);
for(i = 0; i < N; i++){
data[i] = random() % 100;
}
for(i = 0; i < N; i++){
printf("%d ", data[i]);
}
puts("");
// quick sort start
qsort(data, N, sizeof(int), compare);
for(i = 0; i < N; i++){
printf("%d ", data[i]);
}
puts("");
return 0;
}
int Partition(int *data, int low, int high){
int temp = data[low];
while(low < high){
while(low < high && temp <= data[high]){
high--;
}
data[low] = data[high];
while(low < high && temp >= data[low]){
low++;
}
data[high] = data[low];
}
data[low] = temp;
return low;
}
int QuickSort(int *data, int low, int high){
int t;
if(!data) return -1;
if(low >= high) return 0;
t = Partition(data, low, high);
QuickSort(data, low, t-1);
QuickSort(data, t+1, high);
return 0;
}
int compare(const void *p1, const void *p2){
return (*(const int *)p1 - *(const int *)p2);
}
总结
快速排序算法的时间复杂度为O(nlogn),是所有时间复杂度相同的排序方法中性能最好的排序算法。