标签:
先看函数:void Qsort(int* arr, int beg, int end);
我们给它赋予一个功能:把数组中的第beg个元素放到区间【beg, end】有序时该有的位置。
递归实现排序:
void QSort(int* arr, int beg, int end) { if(beg >= end) return; //...把arr中的第beg个元素放到区间【beg, end】有序时该有的位置MyPosition。 /* 然后把MyPosition前面的数和MyPosition后面的数进行递归调用,将实现把每一个值都 放到有序时该有的位置。 */ QSort(arr, beg, MyPosition-1); //(1) QSort(arr, MyPosition+1, end);//(2) }
下面我们实现把数组中的第beg个元素放到区间【beg, end】有序时该有的位置。
int getPartitionPt(int* arr, int beg, int end) { int first = beg; int last = end; int key = arr[beg]; while(last > first) { if(arr[last] > key) //右边一直往左边搜索,找到比关键值小的数 { last--; continue; } if(arr[first] <= key) //左边一直往右边搜索,找到比关键值大的数 { first++; continue; } //交换两值 mySwap(arr[first], arr[last]); } //当退出while的时候first == last,且对应位置的值将比关键值小。 //所以与关键值进行交换就实现了 数组中的第beg个元素放到区间【beg, end】有序时该有的位置。 mySwap(arr[beg], arr[first]); return first; }
方法2:
int getPartitionPt(int* arr, int beg, int end) { int key = arr[beg]; int nSwap = beg+1; for(int i=beg+1; i<=end; i++) { if(arr[i]< key) { mySwap(arr[i], arr[nSwap]); nSwap++; } } mySwap(arr[beg], arr[nSwap-1]); return nSwap-1; }
由此,我们实现了完整的快排:
void QSort(int* arr, int beg, int end) { if(beg >= end) return; int MyPosition = getPartitionPt(arr, beg, end); QSort(arr, beg, MyPosition-1); QSort(arr, MyPosition+1, end); }
标签:
原文地址:http://www.cnblogs.com/wrbxdj/p/4986452.html