快速排序

Posted 程序员小毛驴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。

  快速排序是 C.R.A.Hoare 于 1962 年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

一、快速排序

  1.1 分治法基本思想

  1.先从数列中取出一个数作为基准数(枢轴)。
  2.分区过程将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。(升序)
  3.再对左右区间重复第二步,直到各区间只有一个数。


创建变量i(left)=0(指向第一个数据), j(right)=9(指向最后一个数据) ,target=9(为第一个数据的值)。我们要把所有比target小的数移动到target的左面,所以我们可以开始寻找比9小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标9的数据4比9小,于是把数据4移到下标0的位置,把下标0的数据9移到下标9,完成第一次比较。

  1.2 代码示例

//因为在左边挖坑,从右面开始 找比基准数小的
  while (left < right && arr[right] > target)
  
    right--;
   
   if (left < right)
       arr[left] = arr[right];
       left++;
   

控制台:
+------------------------------------------------------------------+
打印快速排序前的数组:
9 0 2 6 1 7 8 4 3 4 
第1次比较结果:
4 0 2 6 1 7 8 4 3 
+------------------------------------------------------------------+
 第一次比较完后 变量i(left)=1, j=9,target=9,第二轮比较和第一轮相反,我们从左往右寻找比target大的数 每次i++ 结果没有比target大的。跳出循环且递归自己.经过前面2轮比较已经确任9是最大的,这时候可以不用再比较9这个数,将 j--。

//从左向右找比基准数大的
 while (left < right && arr[left] < target)
        left++;
 

//
//  快速排序.cpp
//  数据结构
//
//  Created by 刘龙玲 
//  Copyright © 2016年 liulongling. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//打印数组
void PrintArray1(int* arr, int length)
    for (int i = 0; i < length; i++)
        printf("%d ", arr[i]);
    
    printf("\\n");


int i = 1;

void QuickSort(int* arr,int low,int height)

    
    int left = low;
    int right = height;
    //取出基准数
    int target = arr[left];
    
    if (left < right)
        while (left < right)
            //因为在左边挖坑,从右面开始 找比基准数小的
            while (left < right && arr[right] > target)
            
                right--;
            
            if (left < right)
                arr[left] = arr[right];
                left++;
                printf("第%d次比较结果:\\n",i++);
                PrintArray1(arr, 9);
            
            

            //从左向右找比基准数大的
            while (left < right && arr[left] < target)
                left++;
            
            if (left < right)
                arr[right] = arr[left];
                right--;
                printf("第%d次比较结果:\\n",i++);
                PrintArray1(arr, 9);
            
        
      
        //这个时候 left 和 right 同时指向的位置,将基准数插入这个位置
        arr[left] = target;
        printf("第%d次比较结果:\\n",i++);
        PrintArray1(arr, 9);

        QuickSort(arr, low, left - 1);
        QuickSort(arr, left + 1, height);
    




int main(void)

    
    int array[] =9,0,2,6,1,7,8,4,3,4;
    int length = sizeof(array) / sizeof(int);
    
    printf("打印快速排序前的数组:\\n");
    PrintArray1(array, length);
    
    QuickSort(array,0,length-1);
    
    printf("打印快速排序后的数组:\\n");
    PrintArray1(array, length);
    return 1;
控制台:
+------------------------------------------------------------------+
打印快速排序前的数组:
9 0 2 6 1 7 8 4 3 4 
第1次比较结果:
4 0 2 6 1 7 8 4 3 
第2次比较结果:
3 0 2 6 1 7 8 4 3 
第3次比较结果:
3 0 2 6 1 7 8 4 6 
第4次比较结果:
3 0 2 4 1 7 8 4 6 
第5次比较结果:
3 0 2 4 1 7 8 7 6 
第6次比较结果:
1 0 2 4 1 4 8 7 6 
第7次比较结果:
1 0 2 4 4 4 8 7 6 
第8次比较结果:
0 0 2 3 4 4 8 7 6 
第9次比较结果:
0 1 2 3 4 4 6 7 6 
打印快速排序后的数组:
0 1 2 3 4 4 6 7 8 9 
+------------------------------------------------------------------+

以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序===快速排序

快速排序

排序算法-快速排序

一看就懂的快速排序

一看就懂的快速排序

快速排序