快速排序算法的基本思想是:先找一个基准元素(比如待排序数组的第一个元素),进行一趟快速排序,使得该基准元素左边的所有数据都它小,而右边的所有数据都它大,然后再按此方法,对左右两边的数据分别进行快速排序,整个排序过程可以
递归
进行,以此达到整个数组变成有序
序列
。
比如我们现在对序列arr={-2,6,88,0,-4,56}这6个数进行排序:
0 | 1 | 2 | 3 | 4 | 5 |
-2 | 6 | 88 | 0 | -4 | 56 |
首先向左移动 j ,直到它已经移到最左边,或者找到一个数,使得arr[j] <= key,比如这里j在向左移动,然后它发现移到下标4的时候,对应元素的值为-4,符合条件,就和arr[i]交换了元素的内容,即将-4换到左边-2的位置:
接下来移动 i 了:它会向右移,直到它已经移到最右边,或者找到一个数,使得arr[i]>key,那么这里i发现移到下标1的时候,对应元素为6,大于key,ok,与arr[j]交换元素的值,结果如下:
然后又到j移动了,它发现移到下标1的时候,对应元素的值<=key,就停下来,然后判断,却发现i和j碰头了,所以不交换了:
至此第一趟快速排序结束了,我们可以发现,到目前为止,基准元素-2现在在下标1那里,而它左边的每一个元素{-4}都比它小,而右边的每一个元素{88,0,6,56}都比它大,当然,被分隔出来的这两个序列目前还是无序的,所以我们接下来的任务就是分别对这两个序列进行快速排序,如此递归下去,直到整个数组成为一个有序序列:
由于左边序列{-4}只有一个元素了,那就不用排序了,所以轮到右边序列{88,0,6,56}排序:
同样选基准元素key=88,i指向88对应的位置,j指向56对应的位置:
然后又是跟之前一样将这个序列排成:
{56,0,6,88}
然后,我们又完成了一次快速排序,接下来的任务,就是对基准元素88左右两个序列继续排对吧?,也就是对{56,0,6}继续排,因为88右边没有元素了,所以它右边就不需要递归了..........
最终结果:
另外,附上排序全过程:
原始序列:arr[]={-2,6,88,0,-4,56}
好了,思路介绍到这,又是源码了,还是那句话,若有问题,欢迎各位小伙伴指出哈:
#include <iostream> #include <string> using namespace std; void swap(int i,int j,int arr[]){ int t; t=arr[i];arr[i]=arr[j];arr[j]=t; for(int i=0;i<6;i++){ cout << arr[i] << " "; } cout << endl; } void quicksort(int p,int q,int arr[],int key){ int i,j; i=p; j=q; if(p>=q){ return; } while(1){ while(j>=p && arr[j]>key){j--;} if(j<=i) break; swap(i,j,arr); while(i<=q && arr[i]<=key){i++;} if(j<=i) break; swap(i,j,arr); } quicksort(p,j-1,arr,arr[p]); quicksort(j+1,q,arr,arr[j+1]); } int main(){ int arr[]={-2,6,88,0,-4,56}; int j; quicksort(0,5,arr,arr[0]); for(int i=0;i<6;i++){ cout << arr[i] << " "; } cout << endl; system("pause"); return 0; }