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

    基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有的数据都比另外一部分的所有的数据小,然后再按此方法对这两部分数据分别进行快速排序,以此达到整个数据变成有序序列。

    设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
    一趟快速排序的算法是:
    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
    5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
     
           0   1    2   3   4  5   6   7
       a:3   8   7   1   2   5   6   4   //以第一个元素为主元,right =7, left =0
           2   8   7   1       5   6   4    //从右至左,swap(3,2),主元为3,right=4
       b:2       7   1   8   5   6   4   //从左至右,swap(8,3),主元为3,left = 1
       c:2   1   7       8   5   6   4   //从右至左,swap(1,3),主元为3,right =3
       d:2   1       7   8   5   6   4   //从左至右,swap(7,3) ,主元为3,left=2
       e:2   1   3   7   8   5   6   4   //riight =2; right ==left,将a[left]==3
    // QuickSort2.cpp : 定义控制台应用程序的入口点。  
    //  
      
    #include "stdafx.h"  
    #include <iostream>  
    int Divition(int a[],int left,int right) { int base; base = a[left]; while (left<right) { while(left<right && a[right]>base) { --right; } a[left]=a[right]; while(left<right && a[left]<base) { ++left; } a[right]=a[left]; } a[left]=base; return left; } void QucikSort(int a[],int left,int right) { int i=0; //if 进行一次逻辑判断,根据判断逻辑结果决定是否操作; //while 进行一系列循环操作,可能执行 N 次 ... if(left<right)//注意此处不能用while { i=Divition(a,left,right); QucikSort(a,left,i-1); QucikSort(a,i+1,right); } } int _tmain(int argc, _TCHAR* argv[]) { int a[]={2,1,4,3,6}; QucikSort(a,0,4); for (int i=0;i<5;i++) { printf("%3d ",a[i]); } system("pause"); return 0; }

    转载自:http://blog.csdn.net/feixiaoxing/article/details/6845132

    1. 首先判断输入参数的有效性
    2. 把数组的第一个数据作为比较的原点,比该数据小的数据排列在左边,比该数据大的数据排列在右边
    3. 按照2的方法分别对左边的数组合右边的数据进行和2一样的数据排列

    分析:

                 start                                         end

                 0       1     2     3     4     5    6     7

                  3      8     7     1     2     5     6     4       value=3,length =8,loop=1;front=0;tail=7;

                          _                                       8       gQuickSort[7]=8;tail =6;loop=2;

                  3      8     7     1     2     5     6     4

                           _                                7    8        gQuickSort[6]=7;tail =5;loop=3;

                  3      8     7     1     2     5     6     4

                  1                                        7    8        gQuickSort[0]=7;front =1;loop=4;

                  3      8     7     1     2     5     6     4

                  1      2                                7    8        gQuickSort[0]=7;front =2;loop=5;

                 ·······

                  1      2     3     4     5       6    7    8       front ==tail =2&&loop>end

    int get_middle(int array[], int start, int end)
    {
        int front = 0;
        int tail = end - start;
        int value = array[start];
        int length = end - start + 1;
        int loop = start + 1;
        
        while(loop <= end){
            if(array[loop] < value){
                gQuickSort[front] = array[loop];
                front ++;
            }else{
                gQuickSort[tail] = array[loop];
                tail --;
            }
    
            loop ++;
        }
    
        gQuickSort[front] = value;
        memmove(&array[start], gQuickSort, sizeof(int) * (length));
        return start + front ;
    }
    void _quick_sort(int array[], int start, int end)
    {
        int middle;
        if(start >= end)
            return;
    
        middle = get_middle(array, start, end);
        _quick_sort(array, start, middle -1);
        _quick_sort(array, middle + 1, end);
    }
    
    void quick_sort(int array[], int length)
    {
        int median = 0;
        if(NULL == array || 0 == length)
            return;
    
        _quick_sort(array, 0, length-1);
    }

                 

     
  • 相关阅读:
    Linux C/C++编程之(十四)文件操作相关函数
    javascript语法之循环语句
    javascript语法之流程控制语句
    javascript语法之字符串转换成数字
    javascript语法之声明变量
    认识javascript
    css之定位
    css之盒子模型案例
    常见Css样式
    Css详解之(伪类选择器)
  • 原文地址:https://www.cnblogs.com/lwflourish/p/4491136.html
Copyright © 2011-2022 走看看