快速排序
根据王道书上的代码,对快速排序做整理。
快速排序的思想是:
- 使用双指针法,将第一个元素放在表中合适的位置,使得这个位置左面的元素都小于这个元素,右面的元素都大于等于这个元素。
- 递归的处理这个元素分割而成的两个子表,使得有序。
在编写相关的额代码的时候,一定一定一定要注意函数的退出条件和循环的退出条件
快速排序调用的深度和对应二叉树的深度相同。
快速排序的最好时间复杂度是O(log2n),最坏时间复杂度是O(n^2)
快速排序的最好空间复杂度是O(log2n),最坏空间复杂度是O(n)
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# define LENGTH 10
int i = 0;
void CreateList(int * data, int len)
{
int i = 0;
srand(time(NULL));
for (i=0; i<len; i++) {
data[i] = rand() % 100;
}
return;
}
void PrintList(int * data, int len)
{
int i = 0;
for (i=0; i<len; i++) {
printf("%d ", data[i]);
}
printf("\n");
return;
}
// 将首元素放在合适的位置,返回放置的位置
int Partition(int * data, int low, int high)
{
int middle = data[low]; // 提前将元素保存出来,防止覆盖
while (low < high) {
while(low < high && data[high] >= middle) { // 注意每次移动指针都需要判断指针的关系
high--;
}
data[low] = data[high];
while (low < high && data[low] < middle) {
low++;
}
data[high] = data[low];
}
data[low] = middle;
return low;
}
// 快速排序主函数
void QuickSort(int * data, int low, int high)
{
if (low < high) {
int middle = Partition(data, low, high);
printf("%2d th sort: ", ++i);
PrintList(data, LENGTH);
QuickSort(data, low, middle - 1); // 左子序列
QuickSort(data, middle + 1, high); // 右子序列
}
return;
}
int main(void)
{
int * data = (int *)malloc(sizeof(int) * LENGTH);
CreateList(data, LENGTH);
printf("Before sort: ");
PrintList(data, LENGTH);
QuickSort(data, 0, LENGTH - 1);
printf("After sort: ");
PrintList(data, LENGTH);
return 0;
}