zoukankan      html  css  js  c++  java
  • 快速排序

    http://www.cnblogs.com/maybe2030/p/4715042.html

    非递归快速排序

    http://blog.jobbole.com/93806/

     归并排序

    http://linusp.github.io/2014/01/11/merge-sort.html

    6. 快速排序(Quick Sort)

      基本思想:快速排序算法的基本思想为分治思想。

      1)先从数列中取出一个数作为基准数;

      2)根据基准数将数列进行分区,小于基准数的放左边,大于基准数的放右边;

      3)重复分区操作,知道各区间只有一个数为止。

      算法流程:(递归+挖坑填数)

      1)i=L,j=R,将基准数挖出形成第一个坑a[i];

      2)j--由后向前找出比它小的数,找到后挖出此数a[j]填到前一个坑a[i]中;

      3)i++从前向后找出比它大的数,找到后也挖出此数填到前一个坑a[j]中;

      4)再重复2,3),直到i=j,将基准数填到a[i]。

      时间复杂度:O(nlog(n)),但若初始数列基本有序时,快排序反而退化为冒泡排序。

      快速排序的示例:

      (a)一趟排序的过程:

      (b)排序的全过程

    //快速排序
    void QuickSort(int a[], int L, int R)
    {
        if(L<R)
        {
            int i=L, j=R, temp=a[i];
            while(i<j)
            {
                //从右向左找小于基准值a[i]的元素
                while(i<j && a[j]>=temp)
                    j--;
                if(i<j)
                    a[i++]=a[j];
                //从左向右找大于基准值a[i]的元素
                while(i<j && a[i]<temp)
                    i++;
                if(i<j)
                    a[j--]=a[i];
            }
            //将基准值填入最后的坑中
            a[i]=temp;
            //递归调用,分治法的思想
            QuickSort(a, L, i-1);
            QuickSort(a, i+1, R);
        }
    }
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define MAX_TOP 10000 /*一个很大的栈*/
    #define NUM 500L
     
    /*有关栈的数据结构*/
    struct Region {
        long left;
        long right;
    };
     
    struct Stack {
        struct Region reg[MAX_TOP+1];
        long top;
    };
     
    /*对栈进行操作的函数*/
    void init_stack(struct Stack *s);
    void push_stack(struct Stack *s, struct Region r);
    struct Region pop_stack(struct Stack *s);
    int is_stack_empty(struct Stack *s);
     
    /*与排序有关的函数*/
     
    long partition(double a[], long left, long right);    
    /*划分区间*/
    void nr_qsort(double a[], long left, long right);
     
    int main(void)
    {
        double a[NUM];    
    /*待排序数据*/
        clock_t t_s, t_e;
        long i;
     
        srand(time(NULL));
        for (i = 0; i < NUM; ++i)
            a[i] = rand() % 1000000;
     
        
    /*统计运行时间*/
        t_s = clock();
        nr_qsort(a, 0, NUM-1);
        t_e = clock();
        double t = (t_e - t_s) / (double) CLOCKS_PER_SEC;
        printf("Non Recursive quick sort %ld items used time: %f s
    ", NUM, t);
     
        return 0;
    }
     
    /*implementation*/
     
    void init_stack(struct Stack *s)
    {
        s->top = -1;
    }
     
    void push_stack(struct Stack *s, struct Region r)
    {
        if (s->top == MAX_TOP) {
            fprintf(stderr, "Stack overflow!
    ");
            exit(0);
        }
        s->reg[++s->top] = r;
    }
     
    struct Region pop_stack(struct Stack *s)
    {
        if (s->top == -1) {
            fprintf(stderr, "Stack underflow!
    ");
            exit(0);
        }
        return (s->reg[s->top--]);
    }
     
    int is_stack_empty(struct Stack *s)
    {
        return (s->top == -1);
    }
     
    /*返回划分的区间*/
    long partition(double a[], long left, long right)
    {
        double base = a[left];    
    /*以最左边的元素作为比较基准*/
     
        while (left < right) {
            while (left < right && a[right] > base)
                --right;
            a[left] = a[right];
            while (left <right && a[left] < base)
                ++left;
            a[right] = a[left];
        }
        a[left] = base;
        return    left; 
    }
     
    void nr_qsort(double a[], long left, long right)
    {
        struct Stack s;
        struct Region region, regionlow, regionhi;
        long p; 
    /*记录划分出的分界点*/
     
        init_stack(&s);
        region.left = left;
        region.right = right;
        push_stack(&s, region);
     
        while (!is_stack_empty(&s)) {
            region = pop_stack(&s);
            p = partition(a, region.left, region.right);
            if (p-1 > region.left) {
                regionlow.left = region.left;
                regionlow.right = p - 1;
                push_stack(&s, regionlow);
            }
            if (region.right > p + 1) {
                regionhi.left = p + 1;
                regionhi.right = region.right;
                push_stack(&s, regionhi);
            }
        }
     
    }
  • 相关阅读:
    《病理学》读书笔记
    《药理学》读书笔记
    《人格心理学》读书笔记
    《普通心理学》读书笔记
    UI进阶 跳转系统设置相关界面的方法
    安装cocoapods
    CocoaPods 添加第三方库报错
    Objective-c setObject:forKey:和setValue:forKey:的区别
    解析稍微复杂一点的数据
    获取当前屏幕显示的viewcontroller
  • 原文地址:https://www.cnblogs.com/taek/p/5135696.html
Copyright © 2011-2022 走看看