快排的递归和非递归

常用的快排都是用递归写的,因为比较简单,但是可以用栈来实现非递归的快排。

第一种是递归的快排

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
int quick(int a[],int i ,int j)
{
    int tmp=0,key,b=0;
    int im,jm;
    im=i;
    jm=j;
    key=a[i];
    if(i>j)
        return ;    
    while(i < j){
        while(a[j] > key && i< j)
            j--;
        a[i]=a[j];
        while(a[i] <= key && i < j)
        i++;
        a[j]=a[i];
    }                                    //这块和非递归是不同的,这里用的是覆盖。
    a[i]=key;
    quick(a,im,i-1);
    quick(a,i+1,jm);
    return 0;
}

int *rand_list(int *nums, int len, int range)        //产生随机数
{
    srand(time(NULL));
    int i = 0;
    for(i = 0; i< len; i++)
        nums[i] = rand()%range;
    return nums;
}

int main()
{
    int a[100];
    rand_list(a,100,100);
    int i=0;
    quick(a,0,99);
    for(i=0;i<100;i++)
        printf("%d ",a[i]);
    printf("\n");
}

第二种是非递归

#include<stdio.h>
#define max 20

int sl[max];
int sr[max];
int top =0;

void push(int a, int b)
{
    sl[top] = a;
    sr[top] = b;
    top++;
}

void pop(int* p1, int* p2)
{
    top--;
    *p1 = sl[top];
    *p2 = sr[top];
}

void quick(int* a ,int l,int r)
{
    int al,ar,point,tmp;
    push(l,r);
    while(top){
        pop(&l,&r);
        al = l;
        ar = r;    
        point = a[(al+ar)/2];
        while(al<ar){
            while(a[al] < point && al < ar)
                al++;
            while(a[ar] > point && al < ar)
                ar--;
            if(al <= ar){
                tmp = a[al];
                a[al] = a[ar];
                a[ar] = tmp;
                al++;
                ar--;
            }
        }
        if(l < ar)            //这块和递归是不同的,要注意,这里用的是相互交换
            push(l,ar);
        if(al < r)
            push(al,r);
    }
}

int main()
{
    int a[10] ={2,4,1,8,3,5,9,7,6,0};
    quick(a,0,9);
    int i;
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    printf("\n");    
    return 0;
}
时间: 2024-10-21 14:33:06

快排的递归和非递归的相关文章

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

数据结构二叉树的递归与非递归遍历之 实现可编译(1)java

前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

二叉树遍历递归与非递归实现

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程. 二叉树的遍历分为:前序遍历(也叫先序遍历).中序遍历.后序遍历.所谓前.中.后都是根据当前子树根结点相对左右孩子的位置而言,也就是说: 前序遍历:根结点在前,即:根 ----->左------->右: 中序遍历:根结点在中间,即:左------>根------>右: 后序遍历:根结点在最

树的递归与非递归遍历总结

树的递归遍历遍历很简单,非递归遍历要复杂一些,非递归先序.中序.后序遍历需要用一个辅助栈,而层次遍历则需要一个辅助队列. 树的结构: 1 public class Tree<T> { 2 private T data; 3 private Tree<T> left; 4 private Tree<T> right; 5 ... 6 } 用策略模式定义一个访问工具: 1 public interface Visitor<T> { 2 void process(

全排列(递归与非递归实现)

全排列问题在公司笔试的时候很常见,这里介绍其递归与非递归实现. 递归算法 1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b) 然后a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次递归进行. void swap(string &pszStr,int k,int m) { if(k==m) return ;

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)