快速排序

来源:互联网 发布:windows微信是什么 编辑:程序博客网 时间:2024/06/15 23:52

int GetMid(int a[], int left, int right)//三数取中{int mid = left + (right - left) / 2;if (a[left] <a[right]){if (a[mid] < a[left]){return left;}else{if (a[mid]>a[right]){return right;}else{return mid;}}}else{if (a[right] > a[mid]){return right;}else{if (a[mid] > a[left]){return left;}else{return mid;}}}}//递归实现void Re_FastSort(int a[], int left, int right){if (left >= right){return;}if (right - left < 13){InsertSort(a, right - left + 1);return;}int begin = left;int end = right;int key = GetMid(a, left, right);swap(a[left], a[key]);int temp = a[left];while (begin < end){while (begin<end&&a[end]>temp){end--;}if (begin < end){a[begin] = a[end];begin++;}while (begin<end&&a[begin]<temp){begin++;}if (begin < end){a[end] = a[begin];end--;}}a[begin] = temp;Re_FastSort(a, left, begin - 1);Re_FastSort(a, begin + 1, right);}

//栈实现#include<stack>void NoRe_FastSort(int a[], int left, int right){assert(a);struct left_right{int _left;int _right;left_right(int left, int right):_left(left), _right(right){}};stack<left_right>s;s.push(left_right(left, right));while (!s.empty()){int begin = s.top()._left;int end = s.top()._right;s.pop();int key = GetMid(a, begin, end);swap(a[begin], a[key]);int temp = a[begin];int tmpbegin = begin;int tmpend = end;while (tmpbegin < tmpend){while (tmpbegin < tmpend && a[tmpend] > temp){tmpend--;}if (tmpbegin < tmpend){a[tmpbegin] = a[tmpend];tmpbegin++;}while (tmpbegin < tmpend && a[tmpbegin] < temp){tmpbegin++;}if (tmpbegin < tmpend){a[tmpend] = a[tmpbegin];tmpend--;}}a[tmpbegin] = temp;if (tmpbegin - 1>begin){s.push(left_right(begin, tmpbegin - 1));}if (tmpbegin + 1 < end){s.push(left_right(tmpbegin + 1, end));}}}


0 0
原创粉丝点击