基于C++实现的快速排序算法

 快速排序的基本思想是基于分治法

在待排序表L[1...n]中任取一个元素作为基准pivot,通过一趟排序将待排序表划分为独立的两个部分L[1...k-1]和L[k+1...n],使得L[1...k-1]中的所有元素小于pivot,L[k+1...n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一趟快速排序(或者一次划分),

然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。以上定义均摘抄自王道数据机构。
下面讲讲我的理解:

有3个index,分别是pivot、low、high

首先选取左边第一个值为基准pivot,同时low下标指的也是第一个
将基准值取出来之后,(这里打个比方,相当于巧克力和装巧克力块的盒子,这个盒子想象成一排有多个坑的那种。巧克力块相当于数值,巧克力块下面的坑相当于每个索引)low下标对应的就是空的了,准备接受从high那里传过来的值,
high一般选取最右边的值对应的下标
这些三个都就位后,开始从high移动,因为要保证基准左边的全部小于基准,基准右边的全部大于基准,所以high的目的是找到一个小于基准的值,如果找到的值本来就是大于基准的就不用管,因为它本来就是得在右边,保持原地不动就行,所以当high找到一个比基准小的数时就把它放到刚刚空出来的low里面存起来,这时候high空出来了,等待low指针找到大的数字往里面放,如果high一直找到的数字都是比基准大的数字时就一直往左移动,直到和low下标相遇或者直到找到一个比基准小的数字才停止。这时候到low指针向右移动了,这两个指针移动是交替进行的,low指针的目的是找到一个比基准大的数字,如果找不到一直往右边移动,什么时候停止呢?和high指针相遇或者找到比基准大的数字。low为什么要找比基准大的数字和之前high道理一样,就是如果比基准小说明他位置对了,就是在左边不用动,只要它比基准大就说明它德不配位得挪到右边high的位置。最后当两个指针相遇的时候就说明一趟排序已经完成,将基准放到两个指针相遇的下标处。这样就完成第一次划分了,基准左边的全部小于基准,基准右边的全部大于基准,进行分治算法。分治之后,左边和右边再进行我们的快速排序算法。这是我目前浅显的理解,刚刚才对应代码看明白一点点。

#include
using namespace std;
	//严蔚敏《数据结构》标准分割函数
 Paritition( int A[], int low, int high) {
   int pivot = A[low];
   while (low < high) {
     while (low < high && A[high] >= pivot) {
       --high;
     }
     A[low] = A[high];
     while (low < high && A[low] <= pivot) {
       ++low;
     }
     A[high] = A[low];
   }
   A[low] = pivot;
   return low;
 }
 
 void QuickSort(int A[], int low, int high) //快排母函数
 {
   if (low < high) {
     int pivot = Paritition(A, low, high);
     QuickSort(A, low, pivot - 1);
     QuickSort(A, pivot + 1, high);
   }
 }

int main(){

 int A[9] = {9,3,7,4,8,6,5,1,2};
 cout<<"排序前的 "<

你可能感兴趣的:(java,算法,数据结构)