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

    基本思想:


    通过一趟排序将待排的记录划分为独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序。

    具体做法:

    附设两个位置指示变量 i 和 j ,他们的初值分别指向文件的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键字为 pivotkey ,则首先从 j 所指位置起向前搜索,找到第一个关键字小于 pivotkey 的记录,将其向前移,然后从 i 所指位置起向后搜索,找到第一个关键字大于pivotkey 的记录,将其向后移,重复这两步直至 i 与 j 相等为止。

    用快速排序方法对整型数组进行递增排序。

     1 void quicksort( int data[], int low, int high )
     2 /*用快速排序方法对数组元素data[low.high]作递增排序*/
     3 {
     4     int i, pivot, j;
     5     if ( low < high )
     6     {
     7         pivot = data[low]; i = low; j = high;      //以数组的第一个元素为基准进行划分
     8         while( i < j )
     9         {                                          //从数组的两端交替地向中间扫描
    10             while(i < j && data[j] >= pivot)  j--; //找到第一个比枢轴元素小的元素
    11             if (i < j) data[i++] = data[j];      //比枢轴元素小者移到低下标端
    12             while(i < j && data[i] <= pivot)  i++; //找到第一个比枢轴元素大的元素
    13             if(i < j) data[j--] = data[i];       //比枢轴元素大者移到高下标端
    14         }
    15         
    16         data[i] = pivot;     //枢轴元素移到正确的位置
    17         quicksort(data, low, i-1);   //对前半个子表进行快速排序(递归调用)
    18         quicksort(data, i+1, high);   //对后半个子表进行快速排序
    19     }
    20 } 
    21        

    快速排序小结:

    快速排序算法的时间复杂度为O(nlog2n),在所有算法复杂度为此数量级的排序算法中,快速排序被认为是平均性能最好的一种。但是,若初始记录序列按关键字有序或基本有序时,即每次划分都是将序列划分为某一半序列的长度为0的情况,此时快速排序将蜕变为冒泡排序,算法的时间复杂度为O(n²)。快速排序是不稳定的排序方法。

  • 相关阅读:
    Winform获取应用程序的当前路径的方法集合(转)
    C#制作简易屏保(转)
    在C#实现托盘效果(转)
    应用程序调用内核函数的流程
    windows驱动编程(目录)
    windows驱动编程入门(第一个程序)
    博客园文章编辑器【客户端应用程序】V2.0.0发布,命名为51cnblogs
    线性代数——矩阵二
    CAN通信要注意的问题
    线性代数——向量
  • 原文地址:https://www.cnblogs.com/xiehuan-blog/p/9005855.html
Copyright © 2011-2022 走看看