• 快速排序算法(二)


    1. 快速排序算法

      在常用的快速排序算法中,每一步均将第一个数放到合适的位置。

      下面介绍一种将任意数放到合适位置的快速排序算法。

     1 int Partition(int data[], int length, int start, int end)
     2 {
     3     if(data == NULL || length <= 0 || start <= 0 || end >=length)
     4         throw new std::exception("Invalid parameters");
     5     
     6     int index = RandomInRange(start, end);
     7     Swap(&data[index], &data[end]);
     8     
     9     int small = start - 1;
    10     for(index = start; index < end; index++)
    11     {
    12         if(data[index] < data[end])
    13         {
    14             small++;
    15             if(small != index)
    16                 Swap(&data[index], &data[small]);
    17         }
    18     }
    19     
    20     small++;
    21     Swap(&data[small], &data[end]);
    22     
    23     return small;
    24 }
    25 
    26 int RandomInRange(start, end)
    27 {
    28     int length = end - start + 1;
    29     int ret = rand() % length; //0 ~ length-1
    30 }
    31 
    32 void Swap(int* a, int* b)
    33 {
    34     *b = *b + *a;
    35     *a = *b - *a;
    36     *b = *b - *a;
    37 }
     1 void QuickSort(int data[], int length, int start, int end)
     2 {
     3     if(start == end)
     4         return;
     5     
     6     int index = Partition(data, length, start, end);
     7     if(index > start)
     8         QuickSort(data, length, start, index - 1);
     9     if(index < end)
    10         QuickSort(data, length, index + a, end);
    11 }

    2. 数组中第k大数字

     1 int FindKthNumber(int data[], int length)
     2 {
     3     int middle = length >> 1;
     4     int start = 0;
     5     int end = length - 1;
     6     int index = Partition(data, length, start, end);
     7     while(index != middle)
     8     {
     9         if(index > middle)
    10         {
    11             end = index - 1;
    12             index = Partition(data, length, start, end);
    13         }
    14         else
    15         {
    16             start = index + 1 ;
    17             index = Partition(data, length, start, end);
    18         }
    19     }
    20     
    21     return data[middle];
    22 }
  • 相关阅读:
    0218 scikitlearn库之k*邻算法
    087 Python文件的两种用途
    0217 kd树
    Java8的十大新特性
    Java8的十大新特性
    Spring加载Bean的流程(源码分析)
    Spring加载Bean的流程(源码分析)
    线程池原理(JDK1.8)
    JS原生Ajax和jQuery的Ajax与代码示例ok
    JS原生Ajax和jQuery的Ajax与代码示例ok
  • 原文地址:https://www.cnblogs.com/jmliao/p/8598279.html
Copyright © 2020-2023  润新知