快速排序
Posted swithun333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。
关于快速排序,首先我们不展开讲解,我们先给定一组数组[72,6,57,88,60,42,83,73,48,85]对它来进行排序(你只用跟着我思路来就行了,后面你就会慢慢懂快速排序)
首先我们设置一个两个标记点i,j。i标记要排序的数组的首位置,j标记要排序的数组的末位置。然后拿一个X值去记录一下数组的开始元素72.
第二步,我们首先向前移动j,如果j位置所代表的数组元素是大于X标记元素就继续向前移动,反之把i位置元素变为j现在位置的元素(注意j元素位置值不变)。所以j移动到48的位置时,数组变为[48,6,57,88,60,42,83,73,48,85]。
第三步,我们开始向后移动i标记,如果出现i标记位置的元素大于X,就给j赋值为i所指元素(记住这里不是交换)。反之i继续向后移动。此时数组变为[48,6,57,88,60,42,83,73,99,85].
同理,又开始移动j继续2,3步的操作。
知道i=j的时候,把现在i所指的位置变为X。因为前面你有没有发现72这个数字一直都没有再出现再数组里面了?但是为什么要这么做呢?请看下面分解。数组会变为[48,6,57,42,60,72,83,73,88,85].
这个时候注意观察72左边都是小于72的,72右边都是大于72的!!!
到这里其实就可以引出快速排序的思想了。
其实快速排序就是通过每次对数组进行划分为更小的一部分,然后各自再进行排序。最后排出来的一定就是又顺序的数组了,为什么它就一定是有顺序的数组呢?其实我们每次都是把数组分成左边部分是小于数组第一个元素的部分。右边是大于第一个元素的部分。那么我们一直递归下去,是不是最后就只剩两个元素在进行排序呢?那通过这个方法两个元素就一定可以排出顺序。然后最后再到整个数组就都是有序的,在这里就是用了分治的思想!!!
上代码
void quick_sort(int s[], int l, int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 int i = l, j = r, x = s[l]; while (i < j) { while(i < j && s[j] >= x) // 从右向左找第一个小于x的数 j--; if(i < j) s[i++] = s[j]; while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数 i++; if(i < j) s[j--] = s[i]; } s[i] = x; quick_sort(s, l, i - 1); // 递归调用 quick_sort(s, i + 1, r); } }
以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章