递归实现快速排序

#include <stdio.h>
int a[101], n;

void quicksort(int left, int right) {
    int i,j,t,temp;
    if (left>right)
        return;

    temp = a[left];
    i=left;
    j=right;
    while(i != j) {
        while (a[j]>=temp && i<j)
            j--;
        while (a[i]<=temp && i<j)
            i++;
        if (i<j) {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    a[left]=a[i];
    a[i]=temp;

    quicksort(left, i-1);
    quicksort(i+1, right);
}

int main() {
    int i;
    scanf("%d", &n);
    for (i=1; i<=n; i++)
        scanf("%d", &a[i]);

    quicksort(1, n);

    for (i=1; i<= n; i++)
        printf("%d ", a[i]);

    getchar();
    getchar();

    return 0;
}

递归实现快速排序

时间: 2024-11-29 09:37:34

递归实现快速排序的相关文章

常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)

冒泡排序算法: 总的来说就是两两交换,反复直到有序,第一个记录和第二个记录,若逆序则交换,然后比较第二个和第三个记录,以此类推,直到第 n 个记录和第 n-1个记录比较完毕为止,第一趟排序,结果关键字最大的记录被安排在最后一个位置.对前 n-1个记录继续冒泡排序,使得关键字次大的记录安排在第 n-1个位置.如此重复,直到没有需要交换的记录为止(仅仅是第一个和第二个交换过为止).整个一趟趟的选出最值的过程,仿佛是那水里的气泡,咕嘟咕嘟的往上翻的过程. 递增冒泡排序过程图解: 一般先比较第一个元素和

javascript 递归之 快速排序

1. 快速排序思想 (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元素,都移到"基准"的左边:所有大于"基准"的元素,都移到"基准"的右边. (3)对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止. 2. 数字数组排序步骤分析 (1) 原始数组 [23,4,16,49,34,86,801] (2) 确定中间位置

算法导论 学习二 分治之递归实现快速排序

/// <summary> /// 快速排序 /// </summary> /// <param name="array">需要排序的数组</param> /// <param name="Max">当前排序序列的最大索引</param> /// <param name="Min">当前排序序列的最小索引</param> static void Qui

递归版快速排序-JS代码

1 "use strict" 2 var arr1=[11,21,3,4,0]; 3 function qSort(arr){ 4 var mid,left,right,len,i,j,emptyArr,emptyArr2; 5 len = arr.length; 6 left = []; 7 right = []; 8 emptyArr=[]; 9 emptyArr2=[]; 10 j = 0; 11 if (len < 2){ 12 return arr 13 }else{

快速排序的递归和非递归分析

 1.算法思想     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. (2)快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为: ①分解: 在R[low..hi

笔试算法题(55):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排序中的每一次划分结果 (将left和right都压入堆栈),并且首先处理划分序列较短的子序列(也就是在得到一次划分的左右部分时,首先将长序列入栈,然后让段序列入栈), 这样可以保证当快速排序退化的线性效率的时候,栈大小仍旧在㏒N范围内.算法策略类似于最小子树优先遍历规则: 弱势:当序列已经就绪,每次

快速排序-递归和非递归的实现

快速排序主要就是partition的操作. 排序主体 /* 递归的实现.A[] -->要排序的数组, s --> 开始位置, e --> 结束位置 */ void quickSort(int arr[], int s, int e) { if (s < e) { int p = partition(arr, s, e); /* Partitioning index */ quickSort(arr, s, p - 1); quickSort(arr, p + 1, e); } }

快速排序非递归实现

def quick_sort(arr): ''''' 模拟栈操作实现非递归的快速排序 ''' if len(arr) < 2: return arr stack = [] stack.append(len(arr)-1) stack.append(0) while stack: l = stack.pop() r = stack.pop() index = partition(arr, l, r) if l < index - 1: stack.append(index - 1) stack.

快速排序的总结

快速排序的思想是分而治之,利用递归达到快速排序的效果 首先要选定一个基准数,一般选择最左边的数为基准数,排序的目标就是让这个基准数的左边全小于这个基准数,右边全大于这个基准数.然后以这个基准数为分隔线,在左右两侧再次调用这个排序的函数,直到全部有序.简述过程: 以  8 9 4 7 2 6 首选 1. 选择两个哨兵 i,j 分别指向8,6,基准数为8 2.从j哨兵开始,因为j指向的6小于基准数8,不符合j指向的数都要大于8的要求,所以将j指向的数覆盖i指向的数,同时i指向的数变成9 6 9 4