快速排序算法思路:选一个元素arr[i]作为key值,使得它前方的全部元素大于它,后方的元素全部小于它,这样arr[i]就处于正确的位置了,对i左边和右边的元素继续调用该方法,则数组可以整体有序。因此我们重点要考虑的是如何实现该方法。
先看该方法的具体过程
具体思路:这里把右边作为key,那么就从左边开始比较,从左边找到第一个小于key值的数(下标记为i),把他赋给右边的值,然后再从右边这个值的前一个位置开始查起,找到第一个大于key(下标记为j)的值,赋值给左边的下标为i的元素。左右来回查找,当i=j时。说明整个数组查找完毕,此时当前下标元素左边全部大于key,右边全部小于key。将key赋值给当前下标,则key找到正确的位置。
/*
快速排序
2022/3/9
*/
#include<iostream>
using namespace std;
void quickSort(int *arr,int start,int end);
int main()
{
int arr[9] = { 3,6,2,1,8,7,9,4,0 };
quickSort(arr, 0, 8);
for (int i = 0; i < 9; i++)
{
cout << arr[i];
}
}
void quickSort(int* arr, int start, int end)
{
int key,i,j;
if (start<end)
{
//定的是右边为key值,则从左边找
key = arr[end];
i = start, j = end;
//左右两边重合表示结束,此点就应该是key的位置,左边元素全部大于key,右边元素全部小于key
do
{
//从左边开始找,将左边小于key的第一个元素元素挪到右边。右边坐标j-1,左边坐标i不变
while ((i<j)&&(arr[i]>key))
{
i++;
}
if (i<j)
{
arr[j] = arr[i];
j--;
}
//从右边开始找,将右边大于key的第一个元素挪到左边(之前被复制的数据i处),左边坐标i+1.右边坐标不变
while ((i<j)&&(arr[j]<key))
{
j--;
}
if (i<j)
{
arr[i] = arr[j];
i++;
}
} while (i!=j);
arr[i] = key;
//递归的继续排序剩下的元素
quickSort(arr, start, i - 1);
quickSort(arr, i+1, end);
}
}
执行结果