本代码参考《漫画算法》一书,作者魏梦书。通过双边循环算法实现的快速排序,还有单边循环的快速排序,下次再来实现。
/*
*editor:帮我起个昵称吧
*date:2019.812
*水平有仅供学习参考
*/
#include <stdio.h>
#define DEBUG printf("---------到这里没问题----------\n")
int partiton(int* , int , int );
void quicksort(int* , int , int );
int main(int argc,char* argv )
{
//手动输入要排序的数组
int arr[] = {4,4,6,5,3,2,8,1};
//显示输出的数组
printf("输入的数组为:\n");
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
//调用快速排序函数
quicksort(arr, 0, (sizeof(arr) / sizeof(arr[0]))-1);
//显示排序后的数组
printf("排序后的数组为:\n");
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
//快速排序函数
void quicksort(int* arr,int startIndex,int endIndex)
{
//递归函数出口
if (startIndex >= endIndex)
{
return;
}
//得到及基准元素位置
int pivo = partiton(arr,startIndex,endIndex);
//递归
quicksort(arr, startIndex, pivo - 1);
quicksort(arr, pivo + 1, endIndex);
}
//分治函数
int partiton(int* arr, int startIndex, int endIndex)
{
int pivoValu = arr[startIndex];
int left = startIndex;
int right = endIndex;
while (left < right)
{
//从数组右边找到需要交换的数字
while (arr[right] > pivoValu && left < right)
{
right--;
}
//从数组左边找到需要交换的数字
while (arr[left] <= pivoValu && left < right)
{
left++;
}
//交换
int temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
}
//将基准数字移动到分界处
arr[startIndex] = arr[left];
arr[left] = pivoValu;
return left;
}