快速排序

Posted 8号prince

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。

快速排序的思想:

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 }

 

以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

如何使用sublime代码片段快速输入PHP头部版本声明

代码片段如何使用CSS来快速定义多彩光标

vs2003:快速片段工具