思想:以某一元素为基准,将剩余元素拆分为大于该元素和小于该元素的两部分,然后再分别选取基准元素,重复拆分,知道该部分中剩余元素为一个。
#include <stdio.h>
//输出
void print(int array[], int size)
{
int i = 0;
for(i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
//交换
void swap(int *a, int *b)
{
int temp = *a;
*a = temp;
*a = *b;
*b = temp;
}
//以end下标元素为基准,拆分从start到end的序列为两部分
int partition(int array[], int start, int end)
{
int midVal = array[end]; //基准元素
int i = 0;
int len = end - start + 1; //遍历序列长度
int index = start - 1; //标记交换位置
for(i = start; i < end; i++)
{
/*
小于基准元素的数在前半部分,大于基准元素的数在后半部分
(小于基准元素[start, x])(大于基准元素[x + 1, end - 1])(基准元素 [end])
*/
if(array[i] < midVal) //如果小于基准元素则需进行交换
{
index++;
swap(&array[i], &array[index]);
}
}
//将基准元素放到中间,如果全部小于基准元素,则基准元素位置不变
//如果全部大于基准元素,则位置变为起始位置
//其他在中间某位置
//index是大于基准元素的第一个元素的下标
swap(&array[index + 1], &array[end]);
return index + 1;
}
void quickSort(int array[], int start, int end)
{
int i = 0;
if(end <= start)
{
return;
}
else
{
i = partition(array, start, end); //返回索引
//继续拆分,上一次基准元素已排好序,可忽略
quickSort(array, start, i - 1);
quickSort(array, i + 1, end);
}
}
int main()
{
int array[] = {12, 4, 345, 65, 78, 23, 0, 54, 23, 56, 100};
print(array, 11);
quickSort(array, 0, 10);
print(array, 11);
}