快速排序法

算法思想:

快速排序法的核心思想是:分治思想。即在数组中先确定一个基准数,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的数据均比另一部分的基准数小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

 

实现原理:

(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;
	}
}

  

 

posted @ 2020-09-13 21:06  水墨雍和  阅读(283)  评论(0编辑  收藏  举报