码迷,mamicode.com
首页 > 其他好文 > 详细

转:快速排序的一个小问题没想明白,求助各位

时间:2014-09-17 23:19:33      阅读:373      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   文件   div   

转自:http://bbs.csdn.net/topics/390797415

提问如下:

 1 void QuickSort(int a[],int left,int right)
 2 {
 3     if(left > right)    return ;
 4     int i = left, j = right, temp = a[left];
 5     while(i != j)
 6     {
 7         while(i < j && a[j] >= temp) j--; //注意这两个while
 8         while(i < j && a[i] <= temp) i++; //注意这两个while
 9         
10         if(i < j)
11         {
12             int t = a[i];
13             a[i] = a[j];
14             a[j] = t;
15         }
16 
17     }
18     a[left] = a[i];
19     a[i] = temp;
20 
21     QuickSort(a,left,i-1);
22     QuickSort(a,i+1,right);
23 }

我开始写的时候是先i++后j--,但是这样出来的结果不对,而先j--后i++就没问题,结果是对的,但是我不明白是为啥,谁能给说一下,谢谢

 

 

回答:

(题外话:代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。提醒:再牛×的老师也无法代替学生自己领悟和上厕所!单步调试和设断点调试是程序员必须掌握的技能之一。)

支点是 a[left],即左边第一个数。
最终结果是:i左边的都比支点小,右边的比它大。

1.先--j,后++i,则因为++i 时保证了i<j,故如果j<=i 时,i不再变动。
2.反之,先++i,则可能因为if(i < j)不成立,于是下面swap不执行,导致 i 并不满足最终结果。

eg: 4 8 1 5 7 
1. a). temp = 4, j = 2, i = 1, a[i] = 8, a[j] = 1;  -> 4 1 8 5 7
    b). j = 1, i = 1; ->结束

2. a). i = 1, j =2, a[i] = 8, a[j] = 1;  -> 4 1 8 5 7
    b). i = 2, j = 2; ->结束  这样交换的支点就不对了(8)

 

总结:之前我好像也犯过这个错误。修正后的代码如下。

 1 #include "stdafx.h"
 2 #include <iostream>
 3 void Swap(int &a, int &b)
 4 {
 5     int temp = a;
 6     a = b;
 7     b = temp;    
 8 }
 9 
10 int Partition(int a[], int l, int r)
11 {
12     int i = l, j = r, pivot = a[l];
13     while(i < j)
14     {
15         while(i < j && a[j] >= pivot) --j;
16         while(i < j && a[i] <= pivot) ++i;        
17         Swap(a[i], a[j]);
18     }    
19     Swap(a[l], a[i]);
20     return i;
21 }
22 
23 void QuickSort(int a[], int l, int r)
24 {
25     if(l >= r)    return;
26     int s = Partition(a, l, r);
27     QuickSort(a, l, s - 1);
28     QuickSort(a, s + 1, r);
29 }
30 
31 int _tmain(int argc, _TCHAR* argv[])
32 {
33     int a[] = {4,8,3,7,1,5,6,2};
34     QuickSort(a, 0, sizeof(a)/sizeof(int) - 1);
35 
36     int b[] = {5,3,1,9,8,2,4,7};
37     QuickSort(b, 0, sizeof(b)/sizeof(int) - 1);
38 
39     system("pause");
40     return 0;
41 }

 

转:快速排序的一个小问题没想明白,求助各位

标签:style   blog   http   color   io   os   ar   文件   div   

原文地址:http://www.cnblogs.com/kira2will/p/3978182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!