快速排序学习

3 篇文章 0 订阅

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

最坏情况运行时间为O(n2)。虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳的实用选择,这是因为其平均性能相当好:期望的运行时间为O(nlgn),且O(nlgn)记号中隐含的常熟因子很小。另外,它还能够进行就地排序,在虚拟环境中也能很好的工作。


#include<stdio.h>

#include<stdlib.h>

#define ARRAY_SIZE 10

/*
 QUICISORT(A, p ,r)
1       if p<r
2               then q = PRATITION(A, p ,r)
3               QUICKSORT(A, p, q-1)
4               QUICKSORT(A, q+1, r)


 PARTITION(A, p, r)
1       key = A[r]
2       i = p - 1
3       for j from p to r-1
4               do if A[j] <= key
5                  then i = i + 1
6                       exchange A[i]<->A[j]
7       exchange A[i+1]<->A[r]
8       return i+1
*/


int partition(int *, int, int);
void quick_sort(int *, int, int);
void exchange(int *, int, int);
void print_array(int *, int);
void quick_sort_firstoneiskey(int *, int, int);


int main(void)
{
        int a[ARRAY_SIZE] = {2,8,7,1,3,5,6,4,9,8};
        printf("before quick sort: \n");
        print_array(a, ARRAY_SIZE);

        quick_sort(a, 0, ARRAY_SIZE-1);
        printf("after quick sort: \n");
        print_array(a, ARRAY_SIZE);

        int age[ARRAY_SIZE] = {21, 32, 22, 18, 17, 19, 14, 30, 28, 20};
        printf("before quick sort: \n");
        print_array(age, ARRAY_SIZE);

        quick_sort_firstoneiskey(age, 0, ARRAY_SIZE-1);
        printf("after quick sort first one is key: \n");
        print_array(age, ARRAY_SIZE);


}


int partition(int * a, int p, int r)
{
        int key = a[r];
        int i = p - 1;
        int j = p;
        for(;j <= r - 1;j++)
        {
                if(a[j] <= key)
                {
                        i++;
                        exchange(a, i, j);
                }
        }
        exchange(a, i+1, r);

        return i+1;
}


void quick_sort(int * a, int p, int r)
{
        int q = 0;
        if(p < r)
        {
                q = partition(a, p, r);
                quick_sort(a, p, q-1);
                quick_sort(a, q+1, r);
        }
}


void exchange(int * a, int i, int j)

{

       if(i != j)

       {

                int temp = a[i];

                a[i] = a[j];

                a[j] = temp;

        }

}


void print_array(int * a, int size)
{
        int i = 0;
        for(; i < size; i++)
                printf("%d ", a[i]);
        putchar('\n');
}


void quick_sort_firstoneiskey(int * a, int p, int r)
{
        if(p >= r) return;

        int i = p, j = r, key = a[p];
        while(i < j)
        {
                for(; j > i; j--)
                {
                        if(a[j] < key)
                        {
                                a[i] = a[j];
                                break;
                        }
                }
                for(; i < j; i++)
                {
                        if(a[i] > key)
                        {
                                a[j] = a[i];
                                break;
                        }
                }
        }

        a[i] = key;

        quick_sort_firstoneiskey(a, p, i-1);
        quick_sort_firstoneiskey(a, i+1, r);

}


================================================================================================================

#!/usr/bin/python

def exchange(array, i, j):

    temp = array[i]
    array[i] = array[j]
    array[j] = temp


def partition(array, p, r):

    key = array[r]
    i = p - 1
    for j in range(p,r):
        if array[j] <= key:
            i = i + 1
            exchange(array, i, j)
    exchange(array, i+1, r)
    return i+1


def quick_sort(array, p, r):

    if p < r:
        q = partition(array, p, r)
        quick_sort(array, p, q-1)
        quick_sort(array, q+1, r)


def main():

    a = [2,8,7, 1, 3, 5, 6, 4, 9, 8]
    quick_sort(a, 0, 9)
    print a

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值