zoukankan      html  css  js  c++  java
  • 排序算法——快速排序

    快速排序的原理:在待排序的数字序列{0, 1, ... , n-1, n}中随机选择一个数字作为基准数(一般选择序列中的第一个数字),接着从最后一个元素开始,向前找小于基准数的元素,找到的话,把元素x的值赋到基准数的位置;接着从基准数的下一个位置开始向后查找大于基准数的元素,找到的话,把该元素的值赋到元素x的位置。直到向前和向后遍历的标尺位于同一个元素位置y,这个位置就是基准数应该被放置的位置,接着把基准数赋到y位置。接着,根据上一次基准数的位置y把序列分为两个子序列:{0, ..., y-1}和{y+1, ... , n};对这两个子序列分别使用上述算法继续排序,直至子序列长度为1。

    下面是对应的算法实现:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int quick_sort(int *arr, int begin, int end)
     5 {
     6     if (begin >= end)
     7         return 0;
     8 
     9     int temp = arr[begin];
    10     int head = begin;
    11     int rear = end;
    12     bool flag = false;
    13     while(head < rear)
    14     {
    15         if (!flag)
    16         {
    17             if (arr[rear] < temp)
    18             {
    19                 arr[head++] = arr[rear];
    20                 flag = true;
    21             }
    22             else
    23             {
    24                 rear--;
    25             }
    26         }
    27         else
    28         {
    29             if (arr[head] > temp)
    30             {
    31                 arr[rear--] = arr[head];
    32                 flag = false;
    33             }
    34             else
    35             {
    36                 head++;
    37             }
    38         }
    39     }
    40     arr[head] = temp;
    41     quick_sort(arr, begin, head-1);
    42     quick_sort(arr, head+1, end);
    43 
    44     return 0;
    45 }
    46 
    47 int sort(int *arr, int length)
    48 {
    49     quick_sort(arr, 0, length-1);
    50     return 0;
    51 }
    52 
    53 void print_logs(int *arr, int length)
    54 {
    55     for (int i = 0; i < length; ++i)
    56     {
    57         cout << arr[i];
    58         if (i != length-1)
    59         {
    60             cout << " , ";
    61         }
    62     }
    63     cout << endl;
    64 }
    65 
    66 int main()
    67 {
    68     int a[] = {2, 4, 5, 1, 3, 6, 9, 8, 7, 10, 32, 43, 15, 90, 55, 65, 65, 76, 91};
    69 
    70     int length = sizeof(a) / sizeof(*a);
    71     sort(a, length);
    72 
    73     print_logs(a, length);
    74 
    75     return 0;
    76 }
  • 相关阅读:
    抽象工厂模式
    两个页面之间的另一种传值
    回头看看数据集合
    (kinetis K60)kinetis初体验之GPIO寄存器
    (kinetis K60)UART寄存器 串口收发数据
    (Kinetis K60) LPTMR 延时
    (Kinetis K60)WDOG看门狗测试
    (Kinetis K60) AD采集
    (Kinetis K60) PIT定时中断
    (Kinetis K60) FTM输出PWM
  • 原文地址:https://www.cnblogs.com/slz-coder150315/p/8597999.html
Copyright © 2011-2022 走看看