zoukankan      html  css  js  c++  java
  • 我现在对快速排序的理解

    首先把我根据百度百科里面的C语言版快速排序的理解写出来:

    void qsort2(int *l,int left,int right){
        if(left>=right)
            return;
        int i=left,j=right,t;
        t=l[left];
        while(i<j){
            for(;l[j]>=t && i<j;j--)
                ;
            l[i]=l[j];
            for(;l[i]<=t && i<j;i++)
                ;
            l[j]=l[i];
        }
        l[i]=t;
        qsort2(l,left,i-1);
        qsort2(l,i+1,right);
    }

    这个里面我在理解的时候发现在两个for循环中间如果i==j了,那么还是会有个赋值操作,所以我加了一个判断如下:

    void qsort2(int *l,int left,int right){
        if(left>=right)
            return;
        int i=left,j=right,t;
        t=l[left];
        while(i<j){    
            for(;l[j]>=t && i<j;j--)
                ;
            if(i==j)
                break;
            l[i]=l[j];
            for(;l[i]<=t && i<j;i++)
                ;
            l[j]=l[i];
        }
        l[i]=t;
        qsort2(l,left,i-1);
        qsort2(l,i+1,right);
    }

    这样就不会在i==j的时候在做赋值操作了。

    下面是C语言程序设计中第四章的快速排序:

    void qsort(int *l,int left,int right){
        int i,last;
        void swap(int *v,int i,int j);
        if(left>=right)
            return;
        swap(l,left,(left+right)/2);
        last=left;
        for(i=left+1;i<=right;i++)
            if(l[left]>l[i]){
                swap(l,++last,i);
            }      
        swap(l,left,last);
        qsort(l,left,last-1);
        qsort(l,last+1,right);
    }
    void swap(int *l,int i,int j){
        int temp;
        temp=l[i];
        l[i]=l[j];
        l[j]=temp;
    }

    这个我理解了好久,后来发现这个程序在last+1=i的时候还有swap(l,++last,i)这个操作,我添加了一段代码:

    void qsort(int *l,int left,int right){
        int i,last;
        void swap(int *v,int i,int j);
        if(left>=right)
            return;
        swap(l,left,(left+right)/2);
        last=left;
        for(i=left+1;i<=right;i++)
            if(l[left]>l[i]){
                if(last+1==i){
                    last++;
                    continue;
                }
                swap(l,++last,i);
            }
        swap(l,left,last);
        qsort(l,left,last-1);
        qsort(l,last+1,right);
    
    }

    这样修改完成后,经过我的测试时没有问题的,上面写的都是比较简单的快速排序,第二个算法要比第一个好些(从某种程度来讲),实际的快速排序涉及到了很多算法与数据结构的知识,我还在学习。等学有所成之后会在回来分析这个问题。

    最后把我用来检验排序的main函数也贴出来吧:

    int main(int argc, char const *argv[])
    {
        /* code */
        int v[]={1,2,4,1,2,8,5},n=7,i;
        for(i=0;i<n;i++)
            printf("%d ",v[i] );
        printf("
    ");
        qsort(v,0,n-1);
        for(i=0;i<n;i++)
        printf("%d ",v[i]);
        return 0;
    }
  • 相关阅读:
    VB与SQL Server实现文件上传下载
    rszl数据表和crjsj数据表的关联查询
    网吧忘关QQ的后果
    走 近 WSH
    形容长得丑的30句经典句子
    关机VBS脚本
    C51单片机中断定义
    .NET架构的核心技术
    SQL SERVER的命令行工具Osql的用法
    七七情人节
  • 原文地址:https://www.cnblogs.com/WisWang/p/6028087.html
Copyright © 2011-2022 走看看