一、快速排序简介
1.1 基本思路
为什么再众多的排序中,快速排序特别重要,因为它的评价时间开销最小。
因为它使用了分而治之的思想。
1.2 时间复杂度与空间复杂度
最好、平均的时间,空间复杂度与数学推导有关,不做推导,记住即可。
最坏的时间复杂度:n+(n-1)+(n-2)+…+2+1 = (n+1)n/2 =(n2+n)/2 = O(n2)
二、快速排序C语言实现代码
用C语言实现快速排序方法的基本思路就是前面介绍的快速排序的思路。
但是为了方便交换两个位置的元素,有一点小区别。
2.1 快速排序实现思想
void quickSort(int* arr, int low, int high)
{
//思路:
//1.判断是否快排完毕,low >= high表明快排结束,啥都不做,递归结束
//2.快排为结束,指向以下步骤
// 2.1 获取分割数的位置索引
// 2.2 对分割数的左边进行快速排序
// 2.3 对分割数的右边进行快速排序
int partition;
if (low < high)
{
partition = getPartition(arr, low, high);
quickSort(arr, low, partition-1);
quickSort(arr, partition+1, high);
}
}
2.2 找分界值的实现思想
- 定义一个键值key记录最左边分界元素low的值。
因为键值key记录了low下标的元素,这时low下标的元素可以被覆盖。 - 在范围内(low<high)从最右边开始找起,high向前找比key小的元素,把找到的元素放到low的位置。
若high自减到low表明未找到比key小的元素,low为最小值。
因为high下标的元素复制到了low下标中,这时high下标的元素可以被覆盖。 - 在范围内(low<high)从最左边开始找起,low向后找比key大的元素,把找到的元素放到high的位置。若low自增到high表明未找到比key大的元素,key为数组最大的元素。
因为low下标的元素复制到了high下标中,这时low下标的元素可以被覆盖。 - 重复23,直到low>=high,这时把键值key放到low中。
这时low或high下标的元素可以被覆盖。
int getPartition(int* arr, int lo, int hi)
{
//思路:
//1.确定并且记录分界值:以最左边作为分界值,分割数组
//2.判断是否需要分割:lo>=hi表示分割完毕,lo<hi,表示需要分割
// 2.1 右边往左边扫描,判断是否有比分界值小的元素,有的话替换
// 2.2 左边往右边扫描,判断是否有比分界值大的元素,有的话替换
//
int key = arr[lo];
while (lo < hi)
{
while (lo < hi && arr[hi] >= key)
hi--;
arr[lo] = arr[hi];
while (lo < hi && arr[lo] <= key)
lo++;
arr[hi] = arr[lo];
}
arr[lo] = key;
return lo;
}
2.3 代码
#include <stdio.h>
#define BUF_SIZE 10
/**************************************************
*函数名:display
*作用:打印数组元素
*参数:array - 打印的数组,maxlen - 数组元素个数
*返回值:无
**************************************************/
void display(int array[], int maxlen)
{
int i;
for (i = 0; i < maxlen; i++)
{
printf("%d ", array[i]);
}
printf("\n");
return;
}
int getPartition(int* arr, int lo, int hi)
{
int key = arr[lo];
while (lo < hi)
{
while (lo < hi && arr[hi] >= key) hi--;
arr[lo] = arr[hi];
while (lo < hi && arr[lo] <= key) lo++;
arr[hi] = arr[lo];
}
arr[lo] = key;
return lo;
}
/************************************
*函数名:quickSort
*作用:快速排序算法
*参数:
*返回值:无
************************************/
void quickSort(int* arr, int low, int high)
{
int partition;
if (low < high)
{
partition = getPartition(arr, low, high);
quickSort(arr, low, partition-1);
quickSort(arr, partition+1, high);
}
}
int main()
{
int array[BUF_SIZE] = { 12,85,25,16,34,23,49,95,17,61 };
printf("排列前的数组\r\n");
display(array, BUF_SIZE);
quickSort(array, 0, BUF_SIZE-1);
printf("排列后的数组\r\n");
display(array, BUF_SIZE);
return 0;
}