快速排序【模板】

一、递归版本

手打递归版本

void quickSort(int *arr, int left,int right) {

    if(left>=right)
        return;

    int i=left,j=right;
    int standard = arr[left];

    while(i<j) {

        //find some elements bigger than standard
        while( i<j && arr[i] < standard)
            ++i;

        //find some elements smaller than standard
        while( i<j && arr[j] > standard)
            --j;

        //exchange arr.i and arr.j
        swap(arr[i],arr[j]);
    }
    // i == j where the standard should be

    quickSort(a,left,i-1);
    quickSort(a,i+1,right);
}

《数据结构理论与实践》版本:

int Partition(int *arr, int i,int j) {

    arr[0] = arr[i]; //arr[0] is a temp space

    while(i<j) {

        while(i<j && arr[j] >= arr[0]) --j;

        if( i < j) { //move the smaller element to the front
            arr[i] = arr[j];
            ++i;
        }

        while(i<j && arr[i] < arr[0]) ++i;

        if( i < j) { //move the bigger element to the tail
            arr[j] = arr[i];
            --j;
        }
    }

    arr[i] = arr[0];
    return i;
}

void quickSort(int *arr, int left,int right) {

    int i;
    if(left<right) {
        i = Partition(arr,left,right); //divide the arr into 2 parts
        quickSort(arr,left,i-1);
        quickSort(arr,i+1,right);
    }
}

上面的版本都会有TLE
递归改进版(poj 2623 AC):

void quickSort(int *arr, int left, int right){
    int i = left, j = right;
    int mid = arr[(i+j)/2];
    while(i <= j){
        while(arr[i] < mid) i ++;
        while(arr[j] > mid) j --;
        if(i <= j){
            int tmp;
            tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
            i ++; j --;
        }
    }
    if(i < right) quickSort(arr,i, right);
    if(left < j) quickSort(arr,left, j);
}

二、非递归版本

/**使用栈的非递归快速排序**/
template<typename Comparable>
void quicksort2(vector<Comparable>
 &vec,int low,int high){
    stack<int>
 st;
    if(low<high){
        int mid=partition(vec,low,high);
        if(low<mid-1){
            st.push(low);
            st.push(mid-1);
        }
        if(mid+1<high){
            st.push(mid+1);
            st.push(high);
        }
        //其实就是用栈保存每一个待排序子串的首尾元素下标,下一次while循环时取出这个范围,对这段子序列进行partition操作
        while(!st.empty()){
            int q=st.top();
            st.pop();
            int p=st.top();
            st.pop();
            mid=partition(vec,p,q);
            if(p<mid-1){
                st.push(p);
                st.push(mid-1);
            }
            if(mid+1<q){
                st.push(mid+1);
                st.push(q);
            }
        }
    }
}
时间: 2024-10-30 14:37:28

快速排序【模板】的相关文章

C语言实现选择排序、冒泡排序和快速排序的代码示例_C 语言

选择和冒泡 #include<stdio.h> void maopao(int a[],int len){ int i,j,temp; for(i = 0;i < len - 1 ; i ++){//从第一个到倒数第二个 for (j = 0 ; j < len - 1 - i ; j ++)//排在后的是已经排序的 { if (a[j] > a[j + 1])//大的数换到后面去 { temp = a[j]; a[j] = a[j + 1]; a [j + 1] = tem

MathType符号模板找不到了怎么办

  MathType符号模板消失示例 具体操作过程如下: 1.打开MathType软件进入到公式编辑状态,打开方式可以根据自己习惯来决定,可以在Word中通过"插入"--"对象"来完成,也可以双击现有的公式来打开,还可以直接双击MathType桌面图标来打开. 2.在MathType编辑窗口后,在MathType菜单栏中点击"视图"--"符号面板",再点击"视图"会发现"符号面板"的左边

PS设计教程之制作WordPress新闻博客模板

通常在第一次制作新闻博客模板,很难把握方向.这篇教程将为你提供如何在Adobe Photoshop中制作WordPress新闻博客主题的参考.该主题包括页眉区,图片轮换区域(包含特色文章,最近消息,按照分类显示,侧边栏,widget).如果你是初学者,跟着本教程一步一步来就可以.如果你有一定基础,亦可从本教程中获得新的收获. 点击图片,进行全屏预览. 本教程需用到的资源 · Search · 社交图标 第1步:创建文档 在PS中创建一个1200像素 x 1700像素的文档 标尺工具在本教程中非常

深入XSL(3)---模板规则和模式(转)

模板   深入XSL(3)---模板规则和模式翻译:孙一中  模板规则 模板规则由xsl:template元素来规定."match"属性标识了规则应用的源节点(集).xsl:template. 例如:一个XML文档可能包含下面的内容: This is an <emph>important</emph> point. 下列的模板规则匹配emph类型的元素,另有一个模板产生一fo:sequence 格式化对象,其font-weight属性为粗体(bold). <

jstl-jxls问题: excel模板中foreach的横向和纵向输出的问题

问题描述 jxls问题: excel模板中foreach的横向和纵向输出的问题 如图: 为什么纵向正常,横向时候index就出问题,而属性都是对的.求解

c++-类中某元素的快速排序

问题描述 类中某元素的快速排序 怎么改正可以再排列类中元素nodes[i].degree_num时排列i?我的程序只能排列degree_num 先开始试了第二幅图注解掉的绿色代码,出现了图一情况 我传递的数组 i 0 1 2 3 4 5 6 7 8 a[i] 10 9 8 7 6 5 4 3 2 a[i].degree_num 1 1 1 4 3 1 1 3 1 如何对快速排序改变一下使得能按照第三行重新排列数组内的值第二行 解决方案 a[i]是第2行 a[i].degree_num是第三行 手

求数据库设计模板急急急

问题描述 求数据库设计模板急急急 自主选择一种系统,完成需求分析.概念设计.逻辑结构设计.规范化(3NF)及数据库的创建,并设计功能进行编程实现. 根据所选系统,自己设计多个功能,分别用存储过程.触发器完成. 存储过程或触发器的编程至少实现一个. 求好心人帮忙做一个,谢谢了 解决方案 应付作业最好能雇佣一个枪手帮你,像你这种费时不讨好的事情,想张口要现成的怕没人有时间帮你.既然网上找不到,就没办法了. 解决方案二: 好在你这种简单的需求,花个百把块钱在八戒网上发布下,很多人可以帮你做的. 解决方

前端-用php和mysql为我们实验室建立一个小网站,请问有没有合适的模板源码?

问题描述 用php和mysql为我们实验室建立一个小网站,请问有没有合适的模板源码? 自己在chinaz上下载了几个,但是不尽人意,希望有路过的朋友能够提供帮助,只有建立一个链接数据库的小网站,不用线上上运行,所以模板不用太复杂,前端有了就好,谢谢 解决方案 你应该说明网站用途,根据用途可以决定里的要用什么,只链接数据库使用phpadmin就好 解决方案二: 这样谁说你更想要的是前端的页面

用金山WPS模板制作精美简历

  临近年底,正是应届生求职以及职场人士跳槽高峰.一份好的简历虽然不至于点石成金,但是绝对可以成为最好的敲门砖,为您的面试添分加彩.WPS Office在线模板收集了多种多样的精美简历模板以及面试.求职攻略等,无论你是初入职场的毕业生,还是想要另谋高职的职场人士,都可以在这里找到适合你的一份简历! 用户登录WPS Office官网模板下载频道http://www.wps.cn/download/,在搜索框输入"简历"关键词,就可以下载各种类型的"简历"模板,据此打造