快速排序
1、代码实现(递归)
1 #include <stdio.h> 2 //应注意的是此时的排序仅仅是逻辑地址的改变 3 //实际的存储地址仍是原先顺序 4 5 int Partition(int arr[],int low,int high) 6 { 7 int pivot=arr[low]; //基准为arr[low] 8 while(low<high) 9 { 10 //若在while循环中,说明都是大于等于(小于等于)pivot的元素 11 12 while(low<high&&arr[high]>pivot) 13 high--; 14 arr[low]=arr[high]; //此时arr[high]是小于pivot的元素,将此元素放到low指向的位置 15 while(low<high&&arr[low]<pivot) 16 low++; 17 arr[high]=arr[low];//此时arr[low]是大于pivot的元素,将此元素放到high指向的位置 18 } 19 arr[low]=pivot; 20 return low; 21 } 22 23 int QuickSort(int arr[],int low,int high) 24 { 25 if(low>=high) 26 return; 27 int pivotpos=Partition(arr,low,high); 28 QuickSort(arr,low,pivotpos-1); 29 QuickSort(arr,pivotpos+1,high); 30 } 31 32 int main() 33 { 34 int i; 35 36 int arr[]={45,3,56,12,23,41,65,15,1,8}; 37 int len=sizeof(arr)/sizeof(arr[0]); 38 39 for(i=0;i<len;i++) 40 { 41 printf("%d ",arr[i]); 42 } 43 44 QuickSort(arr,0,len-1); 45 46 printf("\n"); 47 printf("快速排序:"); 48 49 for(i=0;i<len;i++) 50 { 51 printf("%d ",arr[i]); 52 } 53 return 0; 54 }
2、代码分析
设置一个基准,从序列两头分别向内查找,小于基准的放到左边,大于基准的放到右边
当基准的左侧都是小于它的元素,右侧都是大于它的元素时,称为一趟。
在快速排序中,low==high时说明对目标序列排序完成。
对Partition函数的分析:
首先以每个序列的低位置元素作为基准,同时序列的最低位置和最高位置为low和high
进入while循环后,先从右往左开始查找第一个小于基准的元素
while(low<high &&arr[high] >= pivot)
high--;
arr[low] = arr[high];
跳出while循环的条件:a.找到小于基准的元素 b.high移动到low处仍未找到小于基准的元素
当找到小于基准的元素时,跳出循环,将该元素赋值给arr[low],此时元素序列有两个相同的元素

浙公网安备 33010602011771号