zoukankan      html  css  js  c++  java
  • 快排---非递归&递归实现

    递归的核心是栈;可构造辅助栈实现非递归。

    #include<iostream>
    #include <stdio.h> 
    #include <stack> 
    #include <algorithm>
    using namespace std;
    
    int partion(int* arr, int low, int high)
    {
        if (low == high) {
            return low;
        }
        int part = arr[low];
        while (low < high)
        {
             while (high > low && arr[high] >= part)
            {
                high --;
            }
            swap(arr[low], arr[high]);
    
            while (low < high && arr[low] <= part)
            {
                low ++;
            }
            swap(arr[low], arr[high]);
            
        }  
        arr[low] = part;
        return low;
    }
    
    //递归写法
    void quickSort1(int* arr, int low, int high)
    {
        if (low ==high) {
            return;
        }
        int part_index = partion(arr, low, high);
        if (part_index > low) {
            quickSort1(arr, low, part_index -1);
        }
        if (part_index < high) {
            quickSort1(arr, part_index + 1, high);
        }
    }
    
    //非递归写法
    void quickSort2(int* arr, int low, int high)
    {
        stack<int> sk;
        if (low < high) {
            int part_index = partion(arr, low, high);
            if (low < part_index - 1) {
                sk.push(low);
                sk.push(part_index - 1);
            }
            if (part_index + 1 < high) {
                sk.push(part_index + 1);
                sk.push(high);
            }
            while (!sk.empty())
            {
                int high_sk = sk.top();
                sk.pop();
                int low_sk = sk.top();
                sk.pop();
                
                part_index = partion(arr, low_sk, high_sk);
                
                if (low_sk < part_index - 1) {
                    sk.push(low_sk);
                    sk.push(part_index - 1);
                }
                if (part_index + 1 < high) {
                    sk.push(part_index + 1);
                    sk.push(high_sk);
                }
            }
        }
    }
    
    
    int main()
    {
        int a[8] = {4, 2, 6, 7, 9, 5, 1, 3};
      //  quickSort2(a,
    0, 7); for(int i = 0; i < 8; i++) { cout << a[i] << endl; } return 0; }
  • 相关阅读:
    单链表反转的2种常见方法
    LeetCode解题报告:Reorder List
    LeetCode解题报告:Binary Tree Postorder Traversal
    LeetCode解题报告:LRU Cache
    LeetCode解题报告:Insertion Sort List
    Java编程杂记
    如何对一个不断更新的HashMap进行排序
    Python快速入门
    Html与CSS快速入门01-基础概念
    JVM快速入门
  • 原文地址:https://www.cnblogs.com/TMatrix52/p/11724098.html
Copyright © 2011-2022 走看看