zoukankan      html  css  js  c++  java
  • [笔记]一道C语言面试题:实现快速排序

    题目:输入整数数组List及数组长度n,对其进行快速排序

    来源:某500强企业面试题目
    思路:可参考这里的Flash动画,非常清晰明了

    复杂度:时间复杂度O(n log(n))

    //----------------------------------------
    // 实现快速排序
    // 参考Flash动画 http://www.jcc.jx.cn/xinwen3/news/kj/flash/2004/0426/1306.htm
    //----------------------------------------
    
    int Partition(int List[], int L, int R){
      int Pivot = List[L];          // 基准值取第一个
    
      do{                           // 反复循环
        while(List[R] >= Pivot){    // 从后向前找第一个比基准值小的
          R--;                      // 没找到就左移
          if (L == R){              // 判断L和R是否重合,如果重合,则退出
            List[L] = Pivot;
            return L;
          }
        }
    
        List[L] = List[R];          // 取出R指向的数字,放入L中
        L++;                        // L右移
    
        if (L == R){                // 判断L和R是否重合,如果重合,则退出
          List[L] = Pivot;
          return L;
        }
    
        while (List[L] <= Pivot){   // 从前向后找第一个比基准值大的
          L++;                      // 没找到就右移
          if (L == R){              // 判断L和R是否重合,如果重合,则退出
            List[L] = Pivot;        
            return L;
          }
        }
    
        List[R] = List[L];          // 取出L指向的数字,放入R中
        R--;                        // R左移
    
        if (L == R){                // 判断L和R是否重合,如果重合,则退出
          List[L] = Pivot;
          return L;
        }
      }while(true);
    }
    
    void QuickSortList(int List[], int L, int R){
      if (L >= R) return;
    
      int p = Partition(List, L, R);
      QuickSortList(List, L, p - 1);
      QuickSortList(List, p + 1, R);
    }
    
    void QuickSort(int List[], int n){
      QuickSortList(List, 0, n-1);
    }
    
    //----------------------------------------
    // 测试快速排序
    //----------------------------------------
    void TestQuickSort(void){
      int List[] = {3,5,1,3,2,5,0,1,8,4,11,7};
      int n = 12;
      int i;
    
      printf("Before: ");
      for (i = 0; i< n - 1; i++) printf("%d, ", List[i]);
      printf("%d\n", List[n-1]);
      
      printf("After: ");
      QuickSort(List, n);
      for (i = 0; i< n - 1; i++) printf("%d, ", List[i]);
      printf("%d\n", List[n-1]);
      
    }
    Technorati 标签: C语言,面试题
  • 相关阅读:
    socket编程技巧(2)发送缓冲区和接收缓冲区的设置时机
    socket编程技巧(1)tcp接收接口(变长数据定长数据)的编写实例
    libnet介绍与分析
    TCP的6大标示符号
    数据帧中常见协议类型
    C语言中offsetof宏的应用
    ip欺骗(原始套接字系列九)
    ARP欺骗(原始套接字系列八)
    包分析(原始套接字七)
    了解Javascript中函数作为对象的魅力
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/2170449.html
Copyright © 2011-2022 走看看