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 }
  • 相关阅读:
    一次难忘的问题定位
    Linux dmidecode 命令
    linux 查看静态库,动态库是32位还是64位
    MTK功能机按键事件时间设置
    linux控制主板蜂鸣器响起
    Linux 下控制蜂鸣器发声的程序
    Android Studio系列-签名打包
    使用git和github进行协同开发流程
    ero-configuration Web Application Debugging with Xdebug and PhpStorm
    sudo: unable to execute ./script.sh: no such file or directory
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/8569705.html
Copyright © 2011-2022 走看看