快速排序

来源:互联网 发布:中兴网络机顶盒怎么用 编辑:程序博客网 时间:2024/06/05 20:26

思路

给定一个待排序的序列,然后根据枢轴把该序列分为两个可能为空的子序列,该枢轴左边的元素都小于等于枢轴的元素,该枢轴右边的元素都大于等于该枢轴的元素。

递归实现

//快速排序int partion(int *array, int left, int right){int begin = left;//标记第一个节点  int end = right;//标记最后一个节点  int key = array[end];//end是一个坑  while (begin < end){while (begin < end && array[begin] <= key)//从左向右找  {begin++;}array[end] = array[begin];//end坑被填,begin有一个坑  while (begin < end && array[end] >= key)//从右向左找  {end--;}array[begin] = array[end];}array[end] = key;//end坑被填  return end;}void QuiteSortOne(int *array, int left, int right){if (left < right){int pTemp = partion(array, left, right);QuiteSortOne(array, left, pTemp-1);QuiteSortOne(array, pTemp + 1, right);}}

非递归实现

int partion(int *array, int left, int right){int begin = left;//标记第一个节点  int end = right;//标记最后一个节点  int key = array[end];//end是一个坑  while (begin < end){while (begin < end && array[begin] <= key)//从左向右找  {begin++;}array[end] = array[begin];//end坑被填,begin有一个坑  while (begin < end && array[end] >= key)//从右向左找  {end--;}array[begin] = array[end];}array[end] = key;//end坑被填  return end;}//快速排序非递归void QuiteSort(int *array, int left, int right){if (array == NULL || left < 0 || right < 0 || left >= right)return;stack<int> s;int idx = 0, jdx = 0, key = 0;s.push(right);//先压右s.push(left);//再压左while (!s.empty()){idx = s.top();//先标记左s.pop();//左出栈jdx = s.top();//标记右s.pop();//右出栈if (idx < jdx){key = partion(array, idx, jdx);if (key > idx){s.push(key - 1);s.push(idx);}if (key < jdx){s.push(jdx);s.push(key + 1);}}}}





原创粉丝点击