本代码参考《漫画算法》一书,作者魏梦书。面试常考题型快速排序,利用单边循环实现,双边循环法请参考下文:
https://blog.csdn.net/weixin_42377635/article/details/99320647
/*
*editor:帮我起个昵称吧
*date:2019.9.23
*水平有仅供学习参考
*/
#include <stdio.h>
#define DEBUG printf("---------到这里没问题----------\n")
int partiton(int*, int, int);
void quicksort(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 startIndenx, int endIndex)
{
if (startIndenx >= endIndex)
{
return;
}
int pivo = partiton(arr, startIndenx, endIndex);
quicksort(arr, startIndenx, pivo - 1);
quicksort(arr, pivo + 1, endIndex);
}
//分治函数,单边循环
int partiton(int* arr, int startIndex, int endIndex)
{
int pivoValu = arr[startIndex];
int mark = startIndex;
int i = startIndex+1;
for (i; i <= endIndex; i++)
{
if (arr[i] <= pivoValu)
{
mark++;
int temp = arr[i];
arr[i] = arr[mark];
arr[mark] = temp;
}
}
arr[startIndex] = arr[mark];
arr[mark] = pivoValu;
return mark;
}