概念
思想
算法
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
/*
1、数据分为两部分
2、partition
选取pv值
比pv值小的数在pv左边, 比pv值大的放在pv右边
*/
void printArray(int array[], int len)
{
int i = 0;
for (i = 0; i<len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
void swap(int array[], int i, int j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//分组 数组作为函数参数,将退化为指针
//划分过程 第一个元素当枢轴,分成2个有序子序列
int partition(int array[], int low, int high)
{
int pv = array[low];//默认第一个数作为pv值
printf("pv = %d\n", pv);
while (low < high)//两个指针不重合
{
while ((low < high) && (array[high] >= pv))
{
high--;//比基准大,本来就在右边,所以high向左移动
}
swap(array, low, high);//否则就交换
while ((low < high) && (array[low] <= pv))
{
low++;//比基准小,本来就在左边,所以low向右移动
}
swap(array, low, high);//否则就交换
}
printArray(array, 6);
return low;//返回pv值得位置
}
//让n个元素 依此减少 减少到1个元素的时候,因为1个元素可以看成一个有序的序列
void QSort(int array[], int low, int high)
{
if (low < high)
{
//找出 pv值 中心点
int pivot = partition(array, low, high);
//对子序列1排序
QSort(array, low, pivot - 1);
//对子序列2排序
QSort(array, pivot + 1, high);
}
}
void QuickSort(int array[], int len) // O(n*logn)
{
QSort(array, 0, len - 1);
}
int main()
{
int array[] = {12, 5, 433, 253, 216, 7};
//int array[] = {12, 5, 433};
//int array[] = { 12, 5 };
int len = sizeof(array) / sizeof(*array);
printArray(array, len);
printf("------------快排后-----------\n");
QuickSort(array, len);
printArray(array, len);
system("pause");
return 0;
}
复杂度分析