快排的递归和非递归

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快排的递归和非递归相关的知识,希望对你有一定的参考价值。

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


第一种是递归的快排

#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;
}




以上是关于快排的递归和非递归的主要内容,如果未能解决你的问题,请参考以下文章

快速入手八大排序,带你从入门到精通

C++ 快排递归实现和非递归实现

C++ 快排递归实现和非递归实现

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)