快速排序

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],此时元素序列有两个相同的元素

   

posted @ 2023-07-09 19:11  四马路弗洛伊德  阅读(2)  评论(0)    收藏  举报