快速排序(二)最后修改
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 }