快速排序

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

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4 void Swap(int &a, int &b)
 5 {
 6     int temp = a;
 7     a = b;
 8     b = temp;
 9 }
10 
11 void QuickSort(int *array, int left, int right)
12 {    
13     if (left >= right) //递归出口
14     {
15         return;
16     }
17     int holeIndex = left;            //设置初始时当前坑的索引
18     int holeValue = array[holeIndex];   //保存初始时坑里面挖出来的值
19 
20     int l = left;
21     int r = right;
22     while(l < r)
23     {
24         //从右边开始向左找到第一个小于挖出来的值的下标。
25         while(l < r && array[r] >= holeValue)
26             --r;
27         if (l < r) 
28         {//将此值挖出来填入坑中,被挖出来的值所在位置形成新的坑,修改当前坑的索引。
29             array[holeIndex] = array[r];
30             holeIndex = r;        
31             ++l; //坑已经被填,所以自增。
32         }
33     
34         //从左边开始向右找到第一个大于挖出来的值的下标。
35         while(l < r && array[l] <= holeValue)
36             ++l;
37         if (l < r) 
38         {//将此值挖出来填入坑中,被挖出来的值所在位置形成新的坑,修改当前坑的索引。
39             array[holeIndex] = array[l];
40             holeIndex = l;        
41             --r; //坑已经被填,所以自减。
42         }                
43     }
44     //经过以上反复比较和挖坑填坑,剩下最后一个坑,将最开始挖出来的值holeValue填入当前坑中。
45     array[holeIndex] = holeValue; 
46     //以当前坑为分界线,左边的全体值都小于当前坑指向的值,右边的全体值都大于当前坑指向的值。
47     QuickSort(array, left, holeIndex - 1);
48     QuickSort(array, holeIndex + 1, right);
49 }
50 
51 void MoreWindowsQuickSort(int *array, int left, int right)
52 {
53     if (left >= right) return; //递归出口        
54 
55     int l = left, r = right, holeValue = array[l];    
56     while(l<r)
57     {
58         while(l<r && array[r]>=holeValue) //从右往左找第一个小于holeValue的值
59             --r;
60         if (l<r)    
61             array[l++] = array[r];        
62 
63         while(l<r && array[l]<=holeValue) //从左往右找第一个大于holeValue的值
64             ++l;
65         if (l<r)    
66             array[r--] = array[l];    
67     }
68 
69     array[l] = holeValue;   //退出时,l等于r。将holeValue填到这个坑中。
70     MoreWindowsQuickSort(array, left, l-1);
71     MoreWindowsQuickSort(array, l+1, right);
72 }
73 
74 int _tmain(int argc, _TCHAR* argv[])
75 {
76     int array[] = {2,9,6,3,8,5,1,4,7};
77     
78     /*QuickSort(array, 0, 8);*/
79     MoreWindowsQuickSort(array, 0, 8);
80 
81     for (int i=0;i<9;++i)
82         cout<<array[i]<<endl;
83 
84     getchar();
85     return 0;
86 }

 

快速排序参考了:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html 文章中的代码比我的代码更加简洁。

以下是文章中的代码:

 1 void MoreWindowsQuickSort(int *array, int left, int right)
 2 {
 3     if (left >= right) return; //递归出口        
 4 
 5     int l = left, r = right, holeValue = array[l];    
 6     while(l<r)
 7     {
 8         while(l<r && array[r]>=holeValue) //从右往左找第一个小于holeValue的值
 9             --r;
10         if (l<r)    
11             array[l++] = array[r];        
12 
13         while(l<r && array[l]<=holeValue) //从左往右找第一个大于holeValue的值
14             ++l;
15         if (l<r)    
16             array[r--] = array[l];    
17     }
18 
19     array[l] = holeValue;   //退出时,l等于r。将holeValue填到这个坑中。
20     MoreWindowsQuickSort(array, left, l-1);
21     MoreWindowsQuickSort(array, l+1, right);
22 }

 

快速排序的思路:挖坑填数+分治法

参考其他版本快速排序:http://baike.baidu.com/view/19016.htm?from_id=2084344&type=syn&fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&fr=aladdin#3_2

posted @ 2014-08-31 09:50  kira2will  阅读(204)  评论(0编辑  收藏  举报