• 快速排序


    转:快速排序的一个小问题没想明白,求助各位  这个更加简洁

     1 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 void Swap(int &a, int &b)
     5 {
     6     int temp = a;
     7     a = b;
     8     b = temp;
     9 }
    10 
    11 void QuickSort(int *array, int left, int right)
    12 {    
    13     if (left >= right) //递归出口
    14     {
    15         return;
    16     }
    17     int holeIndex = left;            //设置初始时当前坑的索引
    18     int holeValue = array[holeIndex];   //保存初始时坑里面挖出来的值
    19 
    20     int l = left;
    21     int r = right;
    22     while(l < r)
    23     {
    24         //从右边开始向左找到第一个小于挖出来的值的下标。
    25         while(l < r && array[r] >= holeValue)
    26             --r;
    27         if (l < r) 
    28         {//将此值挖出来填入坑中,被挖出来的值所在位置形成新的坑,修改当前坑的索引。
    29             array[holeIndex] = array[r];
    30             holeIndex = r;        
    31             ++l; //坑已经被填,所以自增。
    32         }
    33     
    34         //从左边开始向右找到第一个大于挖出来的值的下标。
    35         while(l < r && array[l] <= holeValue)
    36             ++l;
    37         if (l < r) 
    38         {//将此值挖出来填入坑中,被挖出来的值所在位置形成新的坑,修改当前坑的索引。
    39             array[holeIndex] = array[l];
    40             holeIndex = l;        
    41             --r; //坑已经被填,所以自减。
    42         }                
    43     }
    44     //经过以上反复比较和挖坑填坑,剩下最后一个坑,将最开始挖出来的值holeValue填入当前坑中。
    45     array[holeIndex] = holeValue; 
    46     //以当前坑为分界线,左边的全体值都小于当前坑指向的值,右边的全体值都大于当前坑指向的值。
    47     QuickSort(array, left, holeIndex - 1);
    48     QuickSort(array, holeIndex + 1, right);
    49 }
    50 
    51 void MoreWindowsQuickSort(int *array, int left, int right)
    52 {
    53     if (left >= right) return; //递归出口        
    54 
    55     int l = left, r = right, holeValue = array[l];    
    56     while(l<r)
    57     {
    58         while(l<r && array[r]>=holeValue) //从右往左找第一个小于holeValue的值
    59             --r;
    60         if (l<r)    
    61             array[l++] = array[r];        
    62 
    63         while(l<r && array[l]<=holeValue) //从左往右找第一个大于holeValue的值
    64             ++l;
    65         if (l<r)    
    66             array[r--] = array[l];    
    67     }
    68 
    69     array[l] = holeValue;   //退出时,l等于r。将holeValue填到这个坑中。
    70     MoreWindowsQuickSort(array, left, l-1);
    71     MoreWindowsQuickSort(array, l+1, right);
    72 }
    73 
    74 int _tmain(int argc, _TCHAR* argv[])
    75 {
    76     int array[] = {2,9,6,3,8,5,1,4,7};
    77     
    78     /*QuickSort(array, 0, 8);*/
    79     MoreWindowsQuickSort(array, 0, 8);
    80 
    81     for (int i=0;i<9;++i)
    82         cout<<array[i]<<endl;
    83 
    84     getchar();
    85     return 0;
    86 }

    快速排序参考了:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html 文章中的代码比我的代码更加简洁。

    以下是文章中的代码:

     1 void MoreWindowsQuickSort(int *array, int left, int right)
     2 {
     3     if (left >= right) return; //递归出口        
     4 
     5     int l = left, r = right, holeValue = array[l];    
     6     while(l<r)
     7     {
     8         while(l<r && array[r]>=holeValue) //从右往左找第一个小于holeValue的值
     9             --r;
    10         if (l<r)    
    11             array[l++] = array[r];        
    12 
    13         while(l<r && array[l]<=holeValue) //从左往右找第一个大于holeValue的值
    14             ++l;
    15         if (l<r)    
    16             array[r--] = array[l];    
    17     }
    18 
    19     array[l] = holeValue;   //退出时,l等于r。将holeValue填到这个坑中。
    20     MoreWindowsQuickSort(array, left, l-1);
    21     MoreWindowsQuickSort(array, l+1, right);
    22 }

    快速排序的思路:挖坑填数+分治法

    参考其他版本快速排序:http://baike.baidu.com/view/19016.htm?from_id=2084344&type=syn&fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&fr=aladdin#3_2

  • 相关阅读:
    mongodb安装与启动
    js数组操作
    js字符串操作
    js原型对象和原型链
    Js 原型对象与原型链
    zepto
    闭包的理解
    JSON与XML的区别比较
    ajax 异步请求四个步骤
    angularJS之项目知识
  • 原文地址:https://www.cnblogs.com/kira2will/p/3947364.html
Copyright © 2020-2023  润新知