算法思想:
快速排序法的核心思想是:分治思想。即在数组中先确定一个基准数,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的数据均比另一部分的基准数小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
实现原理:
(1)选取第一个数作为基准数,设置双指针,初始化left=0, right=size-1;
(2) 从最后一个数开始比较
(3)如果right>basic,right--,继续用right所指向的值与basic比较;反之,left++,切换为用left所指向的值与basic比较,若leftt<basic,left++,继续用leftt所指向的值与basic比较,否则,right--,切换为用lright所指向的值与basic比较.
(4)当left=right时,停止,把basic存放到left位置处。
(5)对以basic为界,分成的两部分数组,继续按照上述步骤,在原数组上进行操作,直至数组长度为1。
实现过程:
有无序数组如下如所示:
为了方便,取第一个数据为基准数,即 basic=18, 初始时,input=0,right=7;
第一步:从最右边开始比较,此时right位置所指的数据为11,11<18, 所以将11存放到left所指的位置,并将left前进一位
第二步:此时left所指向的数据为6,6<18,所以位置不变,left前进一位
第三步:继续比较left与basic的值,此时left所指向的数据为9,9<18,所以位置不变,left前进一位
第四步:继续比较left与basic的值,此时left所指向的数据为21,21>18,所以将21存放到right所指向的位置,right退一位
第五步:开始比较lright与basic的值,此时left所指向的数据3,3<18,所以将3存放到left所指向的位置,left进一位
第六步:开始比较lleft与basic的值,此时left所指向的数据7,7<18,所以7的位置不变化,left进一位
第七步:继续比较lleft与basic的值,此时left所指向的数据50,50>18,所以将50存放到right所指的位置,right退一位
第八步:此时left=right,所以第一次排序结束,将basic的值存放到left位置
第九步:对左右两个子数组,继续按上述步骤进行排序。
#include <iostream> using namespace std; //获取下标 int getIndex(int array[], int l, int r) { int basic = array[l]; int left = l; int right = r; int change = 0; while (left<right) { if (change == 0) { if (array[right] >= basic) { right--; } else { array[left] = array[right]; left++; change = 1; } } else { if (array[left] < basic) { left++; } else { array[right] = array[left]; right--; change = 0; } } } array[left] = basic; return left; } //迭代 void quick_sort(int array[], int l, int r) { if(l<r)//数组长度等于1时结束迭代 { int index = getIndex(array, l, r); quick_sort(array, l, index - 1); quick_sort(array, index + 1, r); } } int main() { int array[] = { 18,6,9,21,7,50,3,11 }; quick_sort(array, 0, 7); for (int i = 0; i<8; i++) { cout << array[i] << endl; } }