/*快排 -  递归实现
nlogn
*/
/*
原理:
    快速排序(Quicksort)是对冒泡排序的一种改进。
    快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
*/
/*QuickSort_getKey:选取首元素、中间元素、尾元素这3个元素中间大小的元素,作为Key */
/*Key保存在数组首元素*/
void QuickSort_getKey(int *data, size_t len)
{
    size_t iMin,iMid,iMax;
    int iTmp=0;
   
    if((NULL == data) || (len < 3))
    {
        return;
    }
   
    iMin=0,iMid=len/2,iMax=len-1;
   
    if(data[iMin] > data[iMid])
    {
        iTmp=data[iMin];
        data[iMin]=data[iMid];
        data[iMid]=iTmp;
    }
    if(data[iMid] > data[iMax])
    {
        iTmp=data[iMid];
        data[iMid]=data[iMax];
        data[iMax]=iTmp;
    }
    /*至此iMax保存3者中最大的元素,我们要把中间大小的元素放在首元素位置*/
    if(data[iMid] > data[iMin])
    {
        iTmp=data[iMin];
        data[iMin]=data[iMid];
        data[iMid]=iTmp;
    }
}
void QuickSort_recursion(int* data, size_t len)
{
    size_t i=0,j=len-1;
    int key=0;
   
    if(NULL == data)
    {
        /*throw("Invalid Parameter");*/
        return;
    }
   
    if(len<=1)
    {
        return;/*递归结束标志*/
    }
   
    /*选取Key,置于数组首元素位置*/
    QuickSort_getKey(data, len);
   
    key=data[i];
    while(i<j)
    {
        while((key<=data[j]) && (i<j))
        {
            j--;
        }
        data[i]=data[j];
       
        while((key>=data[i]) && (i<j))
        {
            i++;
        }
        data[j]=data[i];
    }
    data[i]=key;
   
    QuickSort_recursion(data, i);
    QuickSort_recursion(data+i+1, len-i-1);
}
/*快排 -  非递归实现(栈)
nlogn
*/
typedef struct sortFlag
{
    size_t start;
    size_t len;
}stSortFlag;
typedef struct st_Stack
{
    size_t iCount;
    stSortFlag* stSort;
}stStack;
void QuickSort_no_recursion(int* data, size_t len)
{
    size_t i=0,j=0,iStart=0,iLen=0;
    int key=0;
    stStack stck;/*栈内每个元素均表示一段待排序的数组起始地址和长度*/
   
    if(NULL == data)
    {
        /*throw("Invalid Parameter");*/
        return;
    }
   
    if (len < 2)
    {
        return;
    }
   
    stck.iCount = 0;
    stck.stSort = NULL;
   
    /*最坏情况需要len个栈空间*/
    stck.stSort = (stSortFlag*)malloc(len * sizeof(stSortFlag));
    if(NULL == stck.stSort)
    {
        return;
    }
    stck.stSort[stck.iCount].start=0;
    stck.stSort[stck.iCount].len=len;
    ++stck.iCount;
   
    /*用栈代替递归
      每次用递归的时候均入栈
      每次运算的时候均出栈
      栈为空则完成排序
    */
    while(stck.iCount)
    {
        --stck.iCount;/*取一个元素进行排序,相当于出栈*/
        iStart=stck.stSort[stck.iCount].start;
        iLen=stck.stSort[stck.iCount].len;
        i=iStart;
        j=iStart+iLen-1;
       
        /*选取Key,置于数组首元素位置*/
        QuickSort_getKey(data+iStart, iLen);
        key=data[i];
       
        while(i<j)
        {
            while((key<=data[j]) && (i<j))
            {
                j--;
            }
            data[i]=data[j];
           
            while((key>=data[i]) && (i<j))
            {
                i++;
            }
            data[j]=data[i];
        }
        data[i]=key;
       
        if((i-iStart) > 1)
        {
            /*stck.stSort[stck.iCount].start=iStart;*/ /*值未变,此行语句可省略*/
            stck.stSort[stck.iCount].len=i-iStart;
            ++stck.iCount;
        }
       
        if((iStart+iLen-1-i) > 1)
        {
            stck.stSort[stck.iCount].start=i+1;
            stck.stSort[stck.iCount].len=iStart+iLen-i-1;
            ++stck.iCount;
        }
    }
   
    if(NULL != stck.stSort)
    {
        free(stck.stSort);
    }
}

排序算法C语言实现——快速排序的递归和非递归实现的更多相关文章

  1. C#实现(递归和非递归)高速排序和简单排序等一系列排序算法

        本人由于近期工作用到了一些排序算法.就把几个简单的排序算法.想冒泡排序,选择排序,插入排序.奇偶排序和高速排序等整理了出来,代码用C#代码实现,而且通过了測试.希望能给大家提供參考.     ...

  2. 扩展欧几里德算法(递归及非递归实现c++版)

    今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就 ...

  3. C语言实现 二分查找数组中的Key值(递归和非递归)

    基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...

  4. 汉诺塔算法的递归与非递归的C以及C++源代码

    汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...

  5. 回溯算法 DFS深度优先搜索 (递归与非递归实现)

    回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...

  6. 汉诺塔算法c++源代码(递归与非递归)[转]

     算法介绍: 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n - 1(有兴趣的可以自己证明试试看).后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了.首先把三根柱 ...

  7. 求字符串长度之递归与非递归的C语言实现

    在上一篇中介绍了字符串拷贝的递归与非递归的实现,这里就不在赘述递归原理. 递归求字符串长度_strlen: 1 int _strlen(const char *src) 2 { 3 if( src = ...

  8. AJPFX:递归与非递归之间的转化

    在常规表达式求值中: 输入为四则运算表达式,仅由数字.+.-.*./ .(.) 组成,没有空格,要求求其值. 我们知道有运算等级,从左至右,括号里面的先运算,其次是* ./,再是+.- : 这样我们就 ...

  9. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

随机推荐

  1. 1-27TreeSet简介

    使用TreeSet存储Integer对象 TreeSet的特点是可以对存放进去的元素进行排序. package com.monkey1024.set; import java.util.TreeSet ...

  2. [已读]编写高质量代码--Web前端开发修炼之道

    我觉得还蛮实用的一本,推荐看看,主要涉及到这些: 标签语义化.css模块化. css的一些东西,比如haslayout 文档流,还有如何实现水平.垂直居中. js代码组织与js分层.js压缩 编码规范 ...

  3. jasmine+karma 自动化单元测试

    测试的必须性 相信大家都知道测试的必要性,测试先行的概念.不过,写了这么多年的代码,除了之前用java的时候写过一些测试用例,还真的很少写过前端的测试用例,或者做一些自动化测试.感觉做单元测试还是很有 ...

  4. 在switch中的case语句中声明变量会被提前

    原文链接:http://my.oschina.net/u/2000201/blog/514384 本人今天在编写工具类时,无意之间发现,在Java的Swith语句的case语句中声明局部变量时出现了一 ...

  5. Objective-C 类型转换

    类型转换通常是指变量,从一种类型转换成另外一种类型.例如将一个long类型转换成int类型,变量转换通常 用下面的方式: (type_name) expression 在Objective-C中,我们 ...

  6. 企业CIO、CTO必读的34个经典故事

    一. 用人之道 去过庙的人都知道,一进庙门,首先是弥陀佛,笑脸迎客,而在他的北面,则是黑口黑脸的韦陀.但相传在很久以前,他们并不在同一个庙里,而是分别掌管不同的庙.弥乐佛热情快乐,所以来的人非常多,但 ...

  7. 我用ABAP做过的那些无聊的事情

    国庆大假马上就要来临了,我们聊点轻松的话题,关于假期. Jerry的成都同事李贝宁(Li Ben), <SAP成都研究院李三郎:SCP Application Router简介>的作者,有 ...

  8. 微信程序开发系列教程(四)使用微信API创建公众号自定义菜单

    大家可能经常看到一些微信公众号具有功能强大的自定义菜单,点击之后可以访问很多有用的功能. 这篇教程就教大家如何动手做一做. 这个教程最后实现的效果是:创建一个一级菜单"UI5", ...

  9. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver class

    解决方案: @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 作用://取消数据库配置 但是 在用到数据库的时候记 ...

  10. Vue 前端面试题[转]

    https://mp.weixin.qq.com/s/Uxhx2dJ1Xbm6N3Gl7wNZNw Vue 前端面试题 游荡de蝌蚪 前端开发 1周前 作者:游荡de蝌蚪 https://segmen ...