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

    与归并排序一样,快速排序也使用了分治思想。

    对一个典型的字数组A[p...r]进行快速排序的三步分治过程:

    1.数组A[p...r]被划分成两个(可能为空)子数组A[p...q-1]和A[q+1...r],使得:

       A[p...q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1...r]中的每个元素。

    2.通过递归调用快速排序,对字数组A[p...q-1]和A[q+1...r]进行排序

    3.因为字数组都是原址排序,所以不需要合并操作:数组A[p...r]已经有序

    伪代码

    下面的程序实现快速排序

    QUICKSORT(A,p,r)
    if p<r
        q=PARTITION(A,p,r)
        QUICKSORT(A,p,q-1)
        QUICKSORT(A,q+1,r)

    为了排序一个数组A的全部元素,初始调用是QUICKSORT(A,1,A.length)

    算法的关键部分时PARTITION过程,它实现了对字数组A[p...r]的原址重排

    //确定最后一个元素的位置    
    PARTITION(A,p,r)
    x=A[r]
    i=p-1
    for j=p to r-1
        if A[j]<=x
            i=i+1
            exchange A[i] with A[j]
    exchange A[i+1] with A[r]
    return i+1

    数组A[p...r]被划分为4个区域,每个区域都满足一定的性质,对于任意数组下标k,有:

    1.若p≤k≤i,则A[k]≤x

    2.若i+1≤k≤j-1,则A[k]>x

    3.若k=r,则A[k]=x

    下图演示了PARTITION如何在一个包含8个元素的数组上进行操作的过程

    实现跟测试代码

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 int partition(int arr[],int p,int r)
     6 {
     7     int x=arr[r];
     8     int i=p-1;
     9     for(int j=p;j<=r-1;++j)
    10     {
    11         if(arr[j]<=x)
    12         {
    13             i++;
    14             swap(arr[i],arr[j]);
    15         }
    16     }
    17     swap(arr[i+1],arr[r]);
    18     return i+1;
    19 }
    20 
    21 void quick_sort(int arr[],int p,int r)
    22 {
    23     if(p<r)
    24     {
    25         int q=partition(arr,p,r);
    26         quick_sort(arr,p,q-1);
    27         quick_sort(arr,q,r);
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     int arr[]={0,4,7,5,6,1,2,3};
    34     quick_sort(arr,1,7);
    35     for(int i=1;i<=7;++i)
    36         cout<<arr[i]<<' ';
    37     cout<<endl;
    38     system("pause");
    39 }
    View Code
  • 相关阅读:
    centos6.5 升级安装pcre 8.39版本
    解决MongoDB磁盘IO问题的三种方法
    javascript 利用匿名函数对象给你异步回调方法传参数
    spring mvc fastJson 自定义类型转换(返回数据) 实现对ObjectId类型转换
    Java BigDecimal 加减乘除运算
    OKHTTP 3.0
    Chrome 开发者工具中的命令菜单
    vuex 基础:教程和说明
    RxJS 简介:可观察对象、观察者与操作符
    CreateJs入门必知必会
  • 原文地址:https://www.cnblogs.com/runnyu/p/4677531.html
Copyright © 2011-2022 走看看