zoukankan      html  css  js  c++  java
  • 八大排序算法

    快速排序的思想是这样的,如果要对数组区间 [p, r] 的数据进行排序,我们先选择其中任意一个数据作为 pivot(分支点),一般为区间最后一个元素。然后遍历数组,将小于 pivot 的数据放到左边,将大于 pivot 的数据放到右边。接着,我们再递归对左右两边的数据进行排序,直到区间缩小为 1 ,说明所有的数据都排好了序。

     快速排序的分区过程如下所示,从左到右依次遍历数组,如遇到小于 pivot 的元素,则进行数据交换 ,否则继续往前进行,最后再放置 pivot。

     

     代码1:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 void Quick_Sort(vector<int> &data, int left, int right)
     6 {
     7     if (left < right)
     8     {
     9         int i = left, j = left;
    10         int pivot = data[right];
    11 
    12         for (j = left; j < right; j++)
    13         {
    14             if (data[j] < pivot)
    15             {
    16                 swap(data[i], data[j]);
    17                     i++;
    18             }
    19         }
    20         data[j] = data[i];
    21         data[i] = pivot;
    22         Quick_Sort(data, left, i - 1);
    23         Quick_Sort(data, i + 1, right);
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     vector<int> vec;
    30     int n;
    31     cin >> n;
    32     for (int i = 0; i < n; i++)
    33     {
    34         int a;
    35         cin >> a;
    36         vec.push_back(a);
    37     }
    38     cout << "排序前:";
    39     for (auto c : vec)
    40         cout << c << " ";
    41     cout << endl;
    42     Quick_Sort(vec, 0, vec.size() - 1);
    43     cout << "排序后:";
    44     for (auto c: vec)
    45         cout << c << " ";
    46     system("pause");
    47     return 0;
    48 }

     方法2:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 void Quick_Sort(vector<int> &data, int left, int right)
     6 {
     7     if (left < right)
     8     {
     9         int i = left, j = right;
    10         int pivot = data[j];
    11         while (i < j)
    12         {
    13             while (i < j && data[i] <= pivot) // 从左往右找到第一个比 pivot 大的数
    14             {
    15                 i++;
    16             }
    17             if (i < j)
    18             {
    19                 data[j--] = data[i];
    20             }
    21             while (i < j && data[j] >= pivot) // 从右往左找到第一个比 pivot 小的数
    22             {
    23                 j--;
    24             }
    25             if (i < j)
    26             {
    27                 data[i++] = data[j];
    28             }
    29         }
    30         data[i] = pivot; // i=j
    31         Quick_Sort(data, left, i - 1);
    32         Quick_Sort(data, i + 1, right);
    33     }
    34 }
    35 
    36 int main()
    37 {
    38     vector<int> vec;
    39     int n;
    40     cin >> n;
    41     for (int i = 0; i < n; i++)
    42     {
    43         int a;
    44         cin >> a;
    45         vec.push_back(a);
    46     }
    47     cout << "排序前:";
    48     for (auto c : vec)
    49         cout << c << " ";
    50     cout << endl;
    51     Quick_Sort(vec, 0, vec.size() - 1);
    52     cout << "排序后:";
    53     for (auto c: vec)
    54         cout << c << " ";
    55     system("pause");
    56     return 0;
    57 }

    参考资料

  • 相关阅读:
    c#冒泡排序算法和快速排序算法
    sqlserver 索引
    varchar和Nvarchar区别
    trigger
    sql语句
    超实用压力测试工具-ab工具
    js 页面离开前触发事件
    C# websocket与html js实现文件发送与接收处理
    C# socket编程 使用fleck轻松实现对话 https://github.com/statianzo/Fleck
    C# socket编程 使用udp实现单对单的连接对话
  • 原文地址:https://www.cnblogs.com/sunbines/p/10605546.html
Copyright © 2011-2022 走看看