【算法导论】第7章快速排序
1、算法描述
快速排序也是基于分治模式的,下面是一个典型子数组A[p..r]排序的分治过程,主要分为三个步骤:
(1)分解:将数组A[p..r]划分成两个子数组A[p...q-1]和A[q+1...r],使得前一个数组中每个值都小于等于A[q],后一个数组每个值都大于A[q],下标q也在这个分解过程中求得。
(2)解决:通过递归调用对两个子数组分别进行排序。
(3)合并:两个子数组是就地进行排序的,所以他们的合并并不需要操作,这个数组已经有序了。。
2、具体实现:
形参和实参的区别:
(1)实现一:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 int partition(int *ptr,int p,int r)//一次划分过程 3 { 4 int i,j,temp; 5 int x=*(ptr+r-1); 6 i=p-1; 7 for(j=p;j<r;j++) 8 { 9 if(*(ptr+j-1)<=x) 10 { 11 i++; 12 temp=*(ptr+j-1); 13 *(ptr+j-1)=*(ptr+i-1); 14 *(ptr+i-1)=temp; 15 } 16 } 17 i++; 18 temp=*(ptr+i-1); 19 *(ptr+i-1)=*(ptr+r-1); 20 *(ptr+r-1)=temp; 21 return(i); 22 } 23 void quicksort(int *ptr,int p,int r)//递归排序 24 { 25 int q; 26 if(p<r) 27 { 28 q=partition(ptr,p,r); 29 quicksort(ptr,p,q-1); 30 quicksort(ptr,q+1,r); 31 } 32 } 33 void main() 34 { 35 int a[8]={2,8,7,1,3,5,6,4}; 36 quicksort(a,1,8); 37 for(int i=0;i<8;i++) 38 printf("%d ",a[i]); 39 }
(2)实现二:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 int partition(int ptr[],int p,int r)//一次划分过程 3 { 4 int i,j,temp; 5 int x=ptr[r-1]; 6 i=p-1; 7 for(j=p;j<r;j++) 8 { 9 if(ptr[j-1]<=x) 10 { 11 i++; 12 temp=ptr[j-1]; 13 ptr[j-1]=ptr[i-1]; 14 ptr[i-1]=temp; 15 } 16 } 17 i++; 18 temp=ptr[i-1]; 19 ptr[i-1]=ptr[r-1]; 20 ptr[r-1]=temp; 21 return(i); 22 } 23 void quicksort(int ptr[],int p,int r)//递归排序 24 { 25 int q; 26 if(p<r) 27 { 28 q=partition(ptr,p,r); 29 quicksort(ptr,p,q-1); 30 quicksort(ptr,q+1,r); 31 } 32 } 33 void main() 34 { 35 int a[8]={2,8,7,1,3,5,6,4}; 36 quicksort(a,1,8); 37 for(int i=0;i<8;i++) 38 printf("%d ",a[i]); 39 }