快速排序
快速排序
注:观点与图参考《啊哈!算法》
这周我们学习了有关排序的算法,阮阮在上课的时候,听到老师提了一句快速排序是最常见的排序算法,比冒泡排序的效率会高很多,所以非常好学的
阮阮就去了解了一下说明是快速算法,并找他的好朋友,炜炜来和他一起演示这个算法的过程。
一,快速算法的简介:
假设现在对10个数来进行排序6 1 2 7 9 3 4 5 10 8。首先我们要先确定一个基准数,为了方便呢我们就假设第一个数是基准数,现在双向来遍历这个数组,右边先开始遍历(后面会说原因这里很重要),右边往左走的过程中遇到小于基准数的数停下来,然后左边开始往前走,遇到大于基准数的地方停下来,然后将两个位置交换,随后两边继续往后走,直到两者相遇。


让我们用书上的图来做一个理解把!现在假设左边是阮阮,右边是炜炜,炜炜先出发走到5的位置停下来(因为比基准数小),然后阮阮开始走,走到了7的位置上停下来,然后阮阮和炜炜交换位置。接着到最后,左边的都是比6小的数,右边都是比6大的数,这时阮阮和炜炜也相遇了。然后再把6的位置与阮阮的位置进行互换,这样基准数就放在了中间了。现在左右边的数已经分开了,再对左边和右边分别进行这样的操作(这里就用到了本周讲的递归)。
二,代码实现:
#include <stdio.h> int a[101], n;//定义全局变量,这两个变量需要在子函数中进行 void quicksort(int left, int right) {//这个循环 int i, j, t, temp; if (left > right) {//就是两个人相遇的情况 return; } temp = a[left];//temp中储存的是基准数 i = left; j = right; while (i != j) {//两个人不相遇的时候 //顺序很重要,先从右往左找 while (a[j] >= temp && i < j) { j--;//现在这个炜炜就是在小于temp的那个位置 } //阮阮再从左往右找 while (a[i] <= temp && i < j) { i++; } //交换两个数的位置 if (i < j) { t = a[j]; a[j] = a[i]; a[i] = t; } } //最后把基准数归位 a[left] = a[i]; a[i] = temp; //后面就是递归了 quicksort(left, i - 1);//这个是左边的递归 quicksort(i + 1, right);//这个是右边的递归 } int main() { int i, j; scanf_s("%d", &n); for (i = 1; i <= n; i++) { scanf_s("%d", &a[i]); } quicksort(1, n); for (int i = 1; i <= n; i++) { printf("%d ", a[i]); } return 0; }
下面来写这段代码的总结:
来写个总结:先看这个函数,传入的left首先不能大于right,如果大于right的话就直接return,把这个函数清除,接下来炜炜先走,找到一个小于
基准数的数然后停下来,接着阮阮再走,找到一个大于基准数的数然后停下来,接着就将两个人的位置交换,交换完之后,两个人继续往前走,知
道两人相遇,然后把之前用临时变量temp储存的基准数与i的位置进行交换,然后进行递归,每一次就取基准数的前一半和后一半,继续进行这个操
作。最后就会出来派好序的数组。下面就是运行结果:

这里再附上一张啊哈算法中有关的图,比较有助于理解:

这里只是介绍一些比较简单的快速算法,到时候我还会取看看更多的快速算法的优化,看看有没有比较简单(太复杂的我不会)的,我就也发在这个博客上把!

浙公网安备 33010602011771号