快速排序

我的代码执行环境:

操作系统:OS X Yosemite

python版本2.7.6

微信公众平台:今天做了没

快速排序_第1张图片

快速排序:

百度百科解释: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


你可能感兴趣的:(快速排序,C语言实现,Python语言实现)