快速排序(二)最后修改

 1 //2012-07-16
 2 void quickSort(element list[], int left, int right)//快速排序
 3 {
 4     int i=left;
 5     int j=right;
 6 
 7     if(i >= j) //判断需要i<j
 8         return;
 9 
10     element temp=list[i];
11 
12     while(i<j)
13     {
14         while(i<j && list[j]>temp)//需要i<j
15             j--;
16 
17         list[i]=list[j];
18         i++;
19 
20         while(i<j && list[i]<temp)//需要i<j
21             i++;
22 
23         list[j]=list[i];
24         j--;
25     }
26     
27     list[j+1]=temp;// 运行到此处j j+1 i
28 
29     quickSort(list,left,j);
30     quickSort(list,i,right);
31 }
32 
33 void quickSort2(element list[], int left, int right)
34 {
35     int i=left;
36     int j=right;
37 
38     if(i>=j)
39         return;
40 
41     element pivot=list[i];
42     element temp;
43     j++;//以下i++,j--了一次,i是需要首先+1,但j不需要,所以此处需要提前+1,抵消
44     
45     do{
46         do{
47             i++;
48         }while( list[i]<pivot);//不需要i<j,便于之后的交换操作和子快速排序
49 
50         do{
51             j--;
52         }while(list[j]>pivot);//不需要i<j
53 
54         if(i<j)
55         {
56             temp=list[i];
57             list[i]=list[j];
58             list[j]=temp;
59         }
60     }while(i<j);//运行到此处,a[i]>pivot,a[j]<pivot,j=i-1;
61                 //一般情况结束时left...j,i...right  [j]<pivot,[i]>pivot所以交换left和j,
62                 //特殊情况结束时left......right,i=j=right+1//1,2,3,4,5,6,7
63                 //即结束时,i后的都大于pivot,j前的都小于pivot,其中[j]<pivot,[i]>pivot  
64     list[left]=list[j];
65     list[j]=pivot;
66 
67     quickSort(list,left,j-1);
68     quickSort(list,j+1,right);
69     
70 }

下面的是对quickSort方法的修改:

删除了quickSort的18、24行,以及27、29、30进行对应修改。修改之后使得如下代码运行到23行时,i=j,这样思维更清晰。

 1 void quickSort3(element list[], int left, int right)//快速排序,修改时间2012-09-18 16:40:40
 2 {
 3     int i=left;
 4     int j=right;
 5 
 6     if(i >= j) //判断需要i<j
 7         return;
 8 
 9     element temp=list[i];
10 
11     while(i<j)
12     {
13         while(i<j && list[j]>temp)//需要i<j
14             j--;
15 
16         list[i]=list[j];
17 
18         while(i<j && list[i]<temp)//需要i<j
19             i++;
20 
21         list[j]=list[i];
22     }
23     list[i]=temp;// 运行到此处i=j
24 
25     quickSort3(list,left,i-1);
26     quickSort3(list,j+1,right);
27 }
posted @ 2012-07-16 10:13  logzh  阅读(181)  评论(0编辑  收藏  举报