zoukankan      html  css  js  c++  java
  • [Algo][July][Homework]实现快速排序(递归和非递归)

    百度百科:

    https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fr=aladdin&fromid=2084344&fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F

    递归版快速排序

     1 void Qsort(int *a, int low, int high){
     2     //low 是数组的左边界,high是数组的右边界
     3     if(low >= high){
     4         return;
     5     }
     6     //i从左边界向右移,j从右边界向左移
     7     int i,j;
     8     i = low;
     9     j = high;
    10     //数组的第一个元素设为基准key,把大于key的数移到右边,小于key的数移到它左边
    11     int key = a[i];
    12     while(i < j){
    13         while(i < j && a[j]>=key){
    14             j--;
    15         }
    16         a[i] = a[j];
    17         
    18         while(i < j && a[i]<=key){
    19             i++;
    20         }
    21         a[j] = a[i];        
    22     }
    23     a[i] = key; //把key归位
    24     Qsort(a,low,i-1); //按照key的左边和右边,分为两个子数组,递归。
    25     Qsort(a,i+1,high);
    26 }

    非递归版快速排序

    利用栈,每次把一分为二的子数组的头尾入栈。

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int partion(int a[], int low, int high){
     6     int i = low;
     7     int j = high;
     8     int key = a[i];
     9     while(i<j){
    10         while((i<j) && (a[j]>=key)){
    11             j--;
    12         }
    13         a[i] = a[j];
    14         
    15         while((i<j) && (a[i]<=key)){
    16             i++;
    17         }
    18         a[j] = a[i];
    19     }
    20     a[i] = key;
    21     return i;//中值
    22 }
    23 
    24 void Qsort(int a[], int low, int high){
    25     stack<int> st;
    26     int mid;
    27     if(low < high){
    28         mid = partion(a,low,high); //一次排序
    29     }
    30     if(low < mid-1){
    31         //左边子数组压栈,先压小的再压大的
    32         st.push(low);
    33         st.push(mid-1);
    34     }
    35     if(mid+1 < high){
    36         //右边子数组压栈
    37         st.push(mid+1);
    38         st.push(high);
    39     }
    40     while(!st.empty()){
    41         int q = st.top();
    42         st.pop();
    43         int p = st.top();
    44         st.pop();
    45         
    46         mid = partion(a,p,q);
    47         if(p < mid-1){
    48             st.push(p);
    49             st.push(mid-1);
    50         }
    51         if(mid+1 < q){
    52             st.push(mid+1);
    53             st.push(q);
    54         }
    55     }
    56 }
  • 相关阅读:
    Cogs 452. Nim游戏!(博弈)
    Cogs 876. 游戏(DP)
    Cogs 2546. 取石块儿(博弈)
    Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)
    Codevs 3002 石子归并 3(DP四边形不等式优化)
    洛谷 P1041 传染病控制
    洛谷 P1967 货车运输
    洛谷 P1038 神经网络
    洛谷 P1027 Car的旅行路线
    洛谷 P1054 等价表达式
  • 原文地址:https://www.cnblogs.com/hopping/p/7692476.html
Copyright © 2011-2022 走看看