我的代码执行环境:
操作系统:OS X Yosemite
python版本2.7.6
微信公众平台:今天做了没
快速排序:
百度百科解释:http://baike.baidu.com/link?url=l9zJkmAiynMXBWIkmj603zoN9C0Nad2oezqB7smrtgPca7a9eL59fRSGTZIIZE5bGVg0EwHXIluATWgACfQO0nfSDx06s_QtEvjeOmYCvVvCcItkITFbIl-AOpDnaglvdUIeE-FLJOr9Utj5cleOeYQiTvlFEpZ24KHKyWRI7qyVzylOIQx7kAo-TkjThjnU
我自己的理解:现在有两个大小相等数组,一个数组是无序数列,一个数组是空的,现在取无序数列的第一个元素A出来,然后依次用剩下的元素和第一个元素A比较,如果比第一个元素A小,就从空数组的第一个位置开始往后依次放,如果比第一个元素A大,就从空数组的最后一个元素往前依次放。最后所有元素都放好了,空数组现在还剩下一个位置,把最先取的那个元素A放在这个位置。现在A就已经找到了自己的位置。然后数组以A为分隔成两个数组(均不包括A),这两个数组继续重复执行上面的操作。直至数组分割成一个元素为一个数组时,那么整个数列就排好序了。
上面是为了更直观的描述,但其实快速排序是原地排序的,不需要额外的数组来帮助,所以,快速排序时,在取出第一个元素A后,我们是先从最后面开始取元素和A比较,如果出现一个比A小的元素B,就把这个元素B放到A原来的位置上,那么现在B原来的位置就是空的,现在在从前面开始查找第一个比A大的元素C,把这个元素C放到B原来的位置上,C原来的位置就空了,在从后面找第二个比A小的元素,放到C原来的位置上,如此依次进行,就找到了A应该在的位置。然后以A为分隔,前后两个数组再进行如上操作。
下面看C语言的实现版本:
#include <stdio.h> #include <stdlib.h> #include <time.h> void quick_sort(int *numbers, int left, int right) { int key, i, j; i = left; j = right; if (left < right) { key = numbers[i]; while (i < j) { while (i < j && numbers[j] >= key) { j --; } numbers[i] = numbers[j]; while (i < j && numbers[i] <= key) { i ++; } numbers[j] = numbers[i]; } numbers[i] = key; quick_sort(numbers, left, i - 1); quick_sort(numbers, i + 1, right); } } int main(int argc, char *argv[]) { int numbers[10], i; srand(time(NULL)); for (i = 0; i < 10; i ++) { numbers[i] = rand() % 100 + 1; printf("numbers[%d] = %d\n", i, numbers[i]); } quick_sort(numbers, 0, 9); for (i = 0; i < 10; i ++) { printf("numbers[%d] = %d\n", i, numbers[i]); } return 0; }
下面是Python的实现版本:
import random def quick_sort(numbers, left, right): if left < right: i = left j = right key = numbers[i] while i < j: while i < j and numbers[j] >= key: j -= 1 numbers[i] = numbers[j] while i < j and numbers[i] <= key: i += 1 numbers[j] = numbers[i] numbers[i] = key quick_sort(numbers, left, i - 1) quick_sort(numbers, i + 1, right) numbers = range(1, 20) random.shuffle(numbers) print numbers quick_sort(numbers, 0, len(numbers)-1) print numbers