基本思想
步骤
算法代码
#include<iostream>usingnamespacestd; //一趟划分,将 nums 序列划分为两个子序列,左子序列比轴心小,右子序列比轴心大 intPartition(intnums[],intlow,inthigh){ intpivot=nums[low]; //将当前序列的第一个元素设为轴心,对标进行划分 while(low<high){ //循环跳出条件 while(low<high&&nums[high]>=pivot) high--; nums[low]=nums[high]; //将右边比轴心小的元素移到左边 while(low<high&&nums[low]<=pivot) low++; nums[high]=nums[low]; //将左边比轴心大的元素移到右边 } nums[low]=pivot; //轴心元素放到的最终位置 returnlow; //返回存放轴心的最终位置 } //快速排序 intQuickSort(intnums[],intlow,inthigh){ if(low<high){ //递归跳出条件 intpivotIndex=Partition(nums,low,high); //对序列进行划分操作 QuickSort(nums,low,pivotIndex-1); //对左子序列再次进行划分 QuickSort(nums,pivotIndex+1,high); //对右子序列再次进行划分 } } //打印数组 voidprintNum(intnumbers[],intn){ for(inti=0;i<n;i++){ cout<<numbers[i]<<" "; } } intmain() { intnumbers[10]={3,44,38,5,47,15,36,26,27,2}; intn=sizeof(numbers)/sizeof(numbers[0]); //数组长度 QuickSort(numbers,0,9); //调用 InsertSort 函数进行插入排序 printNum(numbers,n); //打印数组 return0; }
注:每一趟Partition( )操作后,表中的元素都会被轴心一分为二。在快速排序算法中,并不产生有序子序列,但每趟排序后会将轴心元素放到其最终的位置上。快速排序的关键就在于pivot在排序之前就拿出来,空一个位置,然后左右指针交替扫描,遇到不符合情况的就把不符合的数字放到空位置,直至左右指针重合,在排序过程中pivot是一直在序列之外的,在一趟排序之后再把pivot放回唯一的空位置就行