码迷,mamicode.com
首页 > 编程语言 > 详细

排序 快速排序

时间:2015-03-16 23:05:14      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:

排序 快速排序

排序 快速排序

这里有一些基本的排序的介绍,当然只是为了我自己个人理解:-)

所谓的快速排序,其实就是以数组的最后一个数值为基准,其他的都和他相比,比他大的,就放到右边,比他小的就放到左边。如果我们定义一个 i = -1,那么每次我们 扫一遍 发现有比 参照 小的,就让i+1,然后把这个比 参照 小的数和现在的i对应的值交换。通过这一遍我们可以发现 参照 所在的位置应该是在i+1处。通过这一遍,我们仅能确定 这个参照所在的位置

算法导论的写法

/*
 * CreateTime: 2014-12-23 14:49:21
 */

#include <stdio.h>

int a[10] = { 12, 2, 16, 30, 28, 10, 16, 20, 6, 18 };

void swap(int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; }

int partition(int l, int r) {
    int i = l - 1;
    int k = a[r];
    for (int j = l; j < r; j++) {
        if (a[j] < k) {
            i++;
            swap(i, j);
        }
    }
    swap(i+1, r);               // 恰好在 i 的位置,从 l~i 都是小 a[r] 的
                                // 所以 a[r] 的位置在 i+1 上,这时 a[r] 是拍好序的

    return i+1;
}
void qsort1(int l, int r) {
    if (l < r) {
        int m = partition(l, r);
        qsort1(l, m-1);
        qsort1(m+1, r);
    }
}

int main(void) {
    qsort1(0, 9);
    for (int i = 0; i < 10; i++) {
        printf("%d  ", a[i]);
    }
    printf("\n");

    return 0;
}

三切向的写法

/*
 * CreateTime: 2014-11-17 13:24:40
 */

#include <stdio.h>

int a[10] = { 1, 454, 634,34, 3, 3, 2343, 23435, 34, 42 };

void swap (int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; }

void quick3(int l, int r) {
    if(l < r) {
        int lt = l;
        int gt = r;
        int i = l + 1;
        int key = a[l];

        while(i <= gt) {
            if(a[i] < key) {
                swap(i++, lt++);
            } else if(a[i] > key) {
                swap(i, gt--);
            } else {
                i++;
            }
        }
        quick3(l, lt-1);
        quick3(gt+1, r);
    }
}

int main(void) {
    quick3(0, 9);
    for(int i = 0; i < 10; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

排序 快速排序

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4343110.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!