快速排序
快速排序的思想:
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 }