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

    快速排序的思想:

    1.假如有一个数组a[n],我们随便取数组中的一个下标为x的元素A(一般取a[x]=A=a[n/2]),经过一顿骚操作,使得数组中下标小于x的元素,其元素值也不大于A,数组中下标大于x的元素,其元素值不小于A;

    2.经过步骤1,数组a[n]被元素A分成了两部分,且左半部分中的所有元素都不大于右半部分的元素。对数组中的A元素左边的下标为0~x-1的元素进行步骤1的骚操作,对数组中的A元素右边的下标为x+1~n的元素进行步骤1的骚操作,则数组a[n]被进一步细分为4部分。不断递归该骚操作,则数据会被一直细分,一直细分到单个元素,则排序完成。

    那么,排序的关键就在于步骤1中的骚操作是如何进行的,现在仔细分析一下:

    首先,按下标依次递减的顺序搜索a[n]到a[x]这部分的元素中,如果有某个元素a[j]的值小于A(即a[x]),则将a[x]和这个元素a[j]的值互换,此时下标x也应相应地变成了j。然后按照下标依次递增的顺序搜索a[0]到a[x]这部分元素中值大于A的元素,不妨假设第一个大于a[x](即A)的值是a[i],则交换a[i]和a[x],此时下标x也应相应地变成了i。不断重复这个操作,直至i==j,这就说明了a[x]的右边已经没有元素比它小了,左边没有元素比它大了,这就是骚操作的精华。

    废话不多说,直接上代码:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 
     5 void quicksortfun(int *a,int m,int n)//a是要排序的数组名,m是数组中将要排序的元素的起始下标,n是数组中将要排序的元素的终止下标
     6 {
     7     int k=(m+n)/2;//k是用来记录我们选中的那个用来比较的值在数组中的下标
     8     int i=m;
     9     int j=n;
    10 
    11     if(m<n)
    12     {
    13         while(i!=j)
    14         {
    15             i=m;
    16             j=n;
    17             int temp=0;
    18 
    19             while(a[k]<=a[j])
    20             {
    21                 if(j==k)
    22                 {
    23                     break;
    24                 }
    25                 j--;
    26             }
    27             temp=a[j];
    28             a[j]=a[k];
    29             a[k]=temp;//到这一步,a[j]中存的是mid的值
    30             k=j;
    31 
    32             while(a[i]<=a[k])
    33             {
    34                 if(i==k)
    35                 {
    36                     break;
    37                 }
    38                 i++;
    39             }
    40             temp=a[i];
    41             a[i]=a[k];
    42             a[k]=temp;
    43             k=i;
    44 
    45         }
    46     
    47     }
    48     
    49 
    50     else
    51     {
    52         return;
    53     }
    54     
    55 
    56     quicksortfun(a,m,k);
    57     quicksortfun(a,k+1,n);
    58 }
    59 
    60 
    61 int main()
    62 {
    63     int str[10]={10,9,8,10,6,6,4,3,7,8};
    64 
    65     quicksortfun(str,0,9);
    66     
    67     for(int i=0;i<10;i++)
    68     {
    69         cout<<str[i]<<" ";
    70     }
    71     cout<<endl;
    72 
    73     return 0;
    74 }
  • 相关阅读:
    POJ 2018 二分
    873. Length of Longest Fibonacci Subsequence
    847. Shortest Path Visiting All Nodes
    838. Push Dominoes
    813. Largest Sum of Averages
    801. Minimum Swaps To Make Sequences Increasing
    790. Domino and Tromino Tiling
    764. Largest Plus Sign
    Weekly Contest 128
    746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8569705.html
Copyright © 2011-2022 走看看