先上代码,再对代码进行图解,大家也可以先把代码跑一遍,有个底…
//快速排序 void my_sort(int arr[],int low,int high) {
//递归结束条件 if (low >= high) return; //记录数组第一个值和最后一个值 int left = low, right = high; //这里我们把第一个数选作中心值 int key = arr[left]; while (left < right) {
while (left < right && arr[right] >= key) {
right--; } arr[left] = arr[right]; while (left < right && arr[left] <= key) {
left++; } arr[right] = arr[left]; } arr[right] = key; my_sort(arr, low, left - 1); my_sort(arr, left + 1, high); } int main(int argc, char *argv[]) {
int arr[10] = {
2,8,6,1,4,3,9,0,7,5 }; int len = sizeof(arr) / sizeof(arr[0]); my_sort(arr, 0, len-1); for (int i = 0; i < 10; i++) {
cout << arr[i] << " "; } cout << endl; system("pause"); return 0; }
第一步
记录数组第一个位置(low)和最后一个位置(high)。
int left = low, right = high;

第二步
选取一个值作为中心值,保存在key中,这里我们选第一个值
int key = arr[left];

此时我们可以看作数组的第一个位置是空出来的(第一个位置的值已经保存到key中了,不用慌~),等待一个从右边数起小于key的值填到第一个位置来。

第三步
从最右边right开始找,找一个小于key的数,找到了便填到空出的位置上(即是left目前所以在的位置),如果找不到说明右边所有的数都比key大,则跳出循环,写代码,当left
= key时,right一直往左边移动
while (left < right && arr[right] >= key) {
right--; } arr[left] = arr[right];
while (left < right && arr[left] <= key) {
left++; } arr[right] = arr[left];
while (left < right) {
while (left < right && arr[right] >= key) {
right--; } arr[left] = arr[right]; while (left < right && arr[left] <= key) {
left++; } arr[right] = arr[left]; }
void my_sort(int arr[],int low,int high) {
//第一步 int left = low, right = high; //第二步 int key = arr[left]; //第五步 while (left < right) {
//第三步 while (left < right && arr[right] >= key) {
right--; } arr[left] = arr[right]; //第四步 while (left < right && arr[left] <= key) {
left++; } arr[right] = arr[left]; } }
于是在第五步循环中再执行第三步的操作,从right开始找到1的位置是小于key的

数组变成这样

右边又空出来了,执行第四步找到6是大于key的,则有

数组变成

此时所有的数都已经遍历完了,再移动一次left和right便会相等,我们就不需要再比较了,就有为什么上面while循环的结束条件是left
arr[right] = key;//也可写成arr[left] = key;因为此时left和right是相等的
my_sort(arr, low, left - 1); my_sort(arr, left + 1, high);
void my_sort(int arr[],int low,int high) {
//递归结束条件 if (low >= high) return; //第一步 int left = low, right = high; //第二步 int key = arr[left]; //第五步 while (left < right) {
//第三步 while (left < right && arr[right] >= key) {
right--; } arr[left] = arr[right]; //第四步 while (left < right && arr[left] <= key) {
left++; } arr[right] = arr[left]; } //第六步 arr[right] = key;//也可写成arr[left] = key;因为此时left和right是相等的 //第七步 my_sort(arr, low, left - 1); my_sort(arr, left + 1, high); }
最后大家如果看懂了的话,回顾上面第三步和第四步的图中,我所画的空出来的位置,并不是那个位置上的数真的被清空了,而是为了方便让大家理解,数组上的数还是存在的,只是我们要往那个位置上填一个比key值大或者比key值小的数。
如有疑问,欢迎大家踊跃留言,最后点一个赞呗~
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178403.html原文链接:https://javaforall.net
