版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tyhaotingdege/article/details/86475642
题目:将乱序数组按从小到大排列。数组中是允许出现重复数字的。
思路挺简单:
(1) 在数组中找个基准值(一般取开头/中间/结尾的数值),以该基准值为界限,将小于基准值的数放在基准值左边,大于基准值的值放在基准值右边。
(2) 基准值左边使用(1)中的方法,递归执行多次后,可以将左边排好。
(3) 基准值右边也一样,使用(1)中的方法,递归执行多次后,可以将右边排好。
代码:
#include <stdio.h>
#include <iostream>
/* 取数组最后一位为基准,构建一个新数组,新数组左边小于基准,新数组右边大于基准 */
int separater(int array[], int begin, int LastSubscript) //数组、数组起始地址、数组最大下标
{
int key = array[LastSubscript];
int leftpart = begin -1;
for(int i = begin; i < LastSubscript; i++)
{
if(array[i] <= key)
{
leftpart++;
std::swap(array[leftpart],array[i]);
}
}
std::swap(array[leftpart+1], array[LastSubscript]);
return (leftpart+1);
}
/* 即是上述“思路”的(2)、(3)步 */
void quicksort(int array[], int begin, int LastSubscript)
{
int position = 0;
if(begin < LastSubscript)
{
position = separater(array, begin, LastSubscript);
quicksort(array, begin,position - 1); //基准值左边递归
quicksort(array, position + 1, LastSubscript); //基准值右边递归
}
}
/* 结果符合从小到大排序要求 */
int main(int argc, char *argv[])
{
int array[] = {8,5,6,3,1,9,4,4};
quicksort(array, 0, 7);
for(int i = 0; i < 8; i++)
{
printf("array[%d] is %d:\n", i, array[i]);
}
}
快排算法到此介绍结束。算法学习并不是完全为了面试,对程序员的编码能力提升也是很大的,近期将不断学习和分享一些算法博客,现有需求的朋友欢迎查看博主“算法分类”中相关内容。