• 快速排序法


      1. #include <stdio.h>
      2. #include <stdlib.h> 
      3.  
      4. void swap(int *x,int *y)  //  交换函数
      5. {
      6.    int temp;
      7.    temp = *x;
      8.    *x = *y;
      9.    *y = temp;
      10. }
      11.  
      12. int choose_pivot(int i,int j )   //取两数平均值函数
      13. {
      14.    return((i+j) /2);
      15. }
      16.  
      17. void quicksort(int list[],int m,int n)   //快速排序函数,m,n分别是左界 右界  比如10个数排序中的 0 和9
      18. {
      19.    int key,i,j,k;
      20.    if( m < n)
      21.    {
      22.       k = choose_pivot(m,n);    求得中间位置的值  
      23.       swap(&list[m],&list[k]);
      24.       key = list[m];
      25.       i = m+1;
      26.       j = n;
      27.       while(i <= j)
      28.       {
      29.          while((i <= n) && (list[i] <= key))
      30.                 i++;
      31.          while((j >= m) && (list[j] > key))
      32.                 j--;
      33.          if( i < j)
      34.                 swap(&list[i],&list[j]);
      35.       }
      36.      // 交换两个元素的位置
      37.       swap(&list[m],&list[j]);
      38.      // 递归地对较小的数据序列进行排序
      39.       quicksort(list,m,j-1);
      40.       quicksort(list,j+1,n);
      41.    }
      42. }
      43.  
      44. void printlist(int list[],int n)
      45. {
      46.    int i;
      47.    for(i=0;i<n;i++)
      48.       printf("%d ",list[i]);
      49. }
      50.  
      51. void main()
      52. {
      53.    const int MAX_ELEMENTS = 10;
      54.    int list[MAX_ELEMENTS];
      55.  
      56.    int i = 0;
      57.    
      58.    // 产生填充序列的随机数
      59.    for(i = 0; i < MAX_ELEMENTS; i++ ){
      60.      list[i] = rand();
      61.    }
      62.    printf("进行排序之前的序列: ");
      63.    printlist(list,MAX_ELEMENTS);
      64.    
      65.    // sort the list using quicksort
      66.    quicksort(list,0,MAX_ELEMENTS-1);
      67.  
      68.    // print the result
      69.    printf("使用快速排序算法进行排序之后的序列: ");
      70.    printlist(list,MAX_ELEMENTS);
      71. }
    1. 这段程序并不难,应该很好看懂,我把过程大致讲一下,首先你的脑子里先浮现一个数组和三个指针,第一个指针称为p指针,在整个过程结束之前它牢牢的指向第一个数,第二个指针和第三个指针分别为lo指针和hi指针,分别指向最左边的值和最右边的值。lo指针和hi指针从两边同时向中间逼近,在逼近的过程中不停的与p指针的值比较,如果lo指针的值比p指针的值小,lo++,还小还++,再小再++,直到碰到一个大于p指针的值,这时视线转移到hi指针,如果 hi指针的值比p指针的值大,hi--,还大还--,再大再--,直到碰到一个小于p指针的值。这时就把lo指针的值和hi指针的值做一个调换。持续这过程直到两个指针碰面,这时把p指针的值和碰面的值做一个调换,然后返回p指针新的位置。
  • 相关阅读:
    深入解析DC/OS 1.8 – 高可靠的微服务及大数据管理平台
    Mesos源码分析
    Openvswitch原理与代码分析(8): 修改Openvswitch代码添加自定义action
    Openvswitch原理与代码分析(7): 添加一条流表flow
    Openvswitch原理与代码分析(6):用户态流表flow table的操作
    Openvswitch原理与代码分析(5): 内核中的流表flow table操作
    Openvswitch原理与代码分析(4):网络包的处理过程
    Openvswitch原理与代码分析(3): openvswitch内核模块的加载
    Openvswitch原理与代码分析(2): ovs-vswitchd的启动
    Openvswitch原理与代码分析(1):总体架构
  • 原文地址:https://www.cnblogs.com/wshyj/p/6012115.html
Copyright © 2020-2023  润新知