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

      快速排序和归并排序一样都是基于递归求解,将问题划分成两个子问题,时间复杂度都是O(nlogn),不同的是快速排序的是基于元素与选定x的大小关系来划分。PS:一般我们选定序列第一个元素作为选定x。

      示例序列:9    4    8    6    5    2   1   3   7  10 

      将9作为选定标准进行划分,小于等于9的都放在左边,大于9的都放在右边(考虑到会出现重复元素的情况

      划分子序列:设置两个指针low和high,分别指向两端。

      从右边开始(注意一定要从右边开始)找到不满足>9的元素,第一遍找到7;

      在从左边开始,找到不满足<=9的元素等号必须出现在这里,因为最后当high==low的时候,要将9和list[high]进行交换,从而9的两边就能划分开了,没有找到,low和high都指向7,

      将9和7进行交换,得到【7     4    8    6    5    2   1   3】   9  【10】,然后将9两边的两个子序列继续进行排序,当只有一个元素的时候,直接return,

       依次递归下去。

    示例代码:

    #include <iostream>
    #include <ctime>
    using namespace std;

    void swap(int &a,int &b)
    {
      int temp=a;
      a=b;
      b=temp;
    }
    int Quick_sort_index(int list[],int begin,int end)
    {
      int low=begin,high=end;
      int num=list[begin];
      while(low<high)
      {
        while(low<high&&list[high]>num)
          high--;
        while(low<high&&list[low]<=num)
          low++;
        if(list[low]!=list[high])
          swap(list[low],list[high]);
      }
      if(list[high]!=num)
        swap(list[high],list[begin]);
      return high;
    }
    void Quick_sort(int list[],int begin,int end)
    {
      if(begin>=end)
        return;
      int index=Quick_sort_index(list,begin,end);
      Quick_sort(list,begin,index-1);
      Quick_sort(list,index+1,end);
    }
    int main()
    {
      int list[10]={1,23,345,12,6,56,45,444,23,46};
      Quick_sort(list,0,9);
      for(int i=0;i<10;i++)
        cout<<list[i]<<" ";
      cout<<endl;
      system("pause");
    }

     

  • 相关阅读:
    ASP.NET的运行原理与运行机制
    VS2008快捷键
    (五)SubSonic的存储过程操作
    110个Oracle常用函数整理汇总
    ASP.NET中HttpModule和HttpHandler的作用及用法
    报表统计(sql面试题)
    ASP.NET C# 数字格式化输出
    ASP.NET Global.ascx 事件大全
    ASP.NET中GUID
    asp.net 页面转向 Response.Redirect, Server.Transfer, Server.Execute的区别
  • 原文地址:https://www.cnblogs.com/hit-joseph/p/5081108.html
Copyright © 2011-2022 走看看