转:快速排序的一个小问题没想明白,求助各位 这个更加简洁
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