C语言 史上最详细快速排序图解,让小白也能轻松理解

C语言 史上最详细快速排序图解,让小白也能轻松理解快速排序可以看作是冒泡排序的一种升级版 优点就是快速 但是稳定性差 因为是史上最详细快速排序 所以我写的非常细 基本每一句代码都解释 图解到位了 需要耐心浏览 先上代码 再对代码进行图解 大家也可以先把代码跑一遍 有个底 快速排序 voidmy sort intarr intlow inthigh 递归结束条件 if low gt high return 记录数组第一个值和最后一个值 intleft low right 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; 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

(0)
上一篇 2026年3月26日 下午5:23
下一篇 2026年3月26日 下午5:23


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号