• 【Algorithm】快速排序(续)


      前面在常用的排序算法中,已经写过一篇关于快速排序算法的博客,但是最近看到《The C Programming Language》这本书中的快速排序算法写的不错,所以就拿过来分享一下,下面我们来看一下吧。
      快速排序算法是C. A. R. Hoare于1962年发明的。快速排序思想是:对于一个给定的数组,从中选择一个元素,以该元素为界将其余元素划分为两个子集。一个子集中的所有元素都小于该元素,另一个子集中的所有元素都大于或等于该元素。对这样两个子集递归执行这一过程,当某个子集中的元素数小于2时,这个子集就不需要再排序,终止递归。
      从执行速度来讲,下列版本的快速排序函数可能不是最快的,但它是最简单的算法之一。在每次划分子集时,该算法总是选取各个子数组的中间元素。

    /*=============================================================================
    #
    #     FileName:   fastSort.c
    #     Algorithm:  快速排序
    #     Author:     Knife
    #     Created:    2014-06-27 16:35:36
    #
    =============================================================================*/
    #include <stdio.h>    
    /* swap函数:交换v[k]与v[j]的值 */   
     void swap(int v[], int k, int j)   {    
        int temp;   
        temp = v[k];   
        v[k] = v[j];  
        v[j] = temp;   
    }    
    /* 快速排序 */
    void qsort(int v[], int left, int right)   {
        int j, last;    
        if (left >= right){                 /* 若数组包含的元素个数少于两个,则return */   
            return;
        }
        swap(v, left, (left + right)/2);    /* 将划分子集的元素移动到v[left] */   
        last = left;                           
        for (j = left+1; j <= right; j++){  /* 划分子集 */ 
            if (v[j] < v[left]){    
                swap(v, ++last, j);    
            }   
        }    
        /* 将分割点left放到last的位置,这样可以保证现在序列为【小小...小[关键字]大大...大】 */
        swap(v, left, last);                
        /* 分别对分割点的左右子集进行递归 */
        qsort(v, left, last-1);  
        qsort(v, last+1, right);   
    }    
    
    void main()   {   
        int j;    
        int arr[] = {14,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7};  
        qsort(arr, 0, 19);   
        for(j=0; j<=19; j++){    
            printf("%d ", arr[j]);
        }    
        printf("
    ");   
    }
  • 相关阅读:
    python使用zipfile递归压缩和解压缩文件
    文件上传控件bootstrap-fileinput中文设置没有效果的情况
    vue keep-alive 不生效和多级(三级以上)缓存失败
    Entityframework批量删除
    EasyUI ComboGrid 集成分页、按键示例
    在Entity Framework中使用事务
    MVC实用构架设计(三)——EF-Code First(6):数据更新最佳实践
    Entityframework更新数据和插入数据
    esayui-datagrid的使用
    javascript:;与javascript:void(0)使用介绍
  • 原文地址:https://www.cnblogs.com/ningvsban/p/3812304.html
Copyright © 2020-2023  润新知