快速排序的核心思想
分治法:将一个大整体经过第一趟排序分成两个部分(比第一个数大的和比第一个数小的)
在比第一个数小的部分中,经过第二趟排序又分为两部分
……
小部分完成任务后,再合并成大整体。
快速排序的步骤
1、找到一个数key,key一般是部分数里面的第一个数,在num数组中从左往右依次寻找比key大的数num[i],从右往左依次寻找比key小的数num[j],当 ( i < j ) && ( num[i] > num[j] )时,num[i] 与num[j]交换数值,以此类推,当 i == j 时,第一趟排序结束;
2、第二趟排序,范围为0 - i,重复第一趟的操作;
……
n、0 - i 之间的排序完成后,接着i - (j - 1)之间的排序;
……
最后,排序完成。
代码实现
void qiuck_sort(int array[], int left, int right)
{
int i = left, j = right;
int temp;
int key;
key =(left + right) / 2;
while (i <= j)
{
//从左到右依次寻找比key大的数
while (array[i] < arr[key])
{
i++;
}
//从右到左依次寻找比key小的数
while (array[j] > arr[key])
{
j--;
}
//如果i <= j,互换元素
if (i <= j)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
//递归实现部分排序
if (left < j)
{
qiuck_sort(array, left, j);
}
if (i < right)
{
qiuck_sort(array, i, right);
}
}