C++快速排序,分治递归思想

 c++快排算法,自己用来做笔记,时间原因写的比较乱,可以参考一下。

int array[] = { 60, 68, 59, 52, 72, 28, 96, 33, 24 };
0 1 2 3 4 5 6 7 8
60 68 59 52 72 28 96 33 24

        原始数组,现在的实现思想就是取一个基准,从右边开始找比基准小的,往左边放, 右边就空了一个位置,需要

从左边找比基准大的往右边空位置放。依次填空,补空。

0 1 2 3 4 5 6 7 8
  68 59 52 72 28 96 33 24

        首先取区间第一数a[0]=60为基准,设置x = a[0]=60,所以a[0]相当于空了,需要来找数组右边i = 8到i=0比基准小的数字来填充。

0 1 2 3 4 5 6 7 8
24 68 59 52 72 28 96 33  

        右边比x=60小的就是j = 8 的数array[8]=24,所以 a[0]=a[8]=24,

        所以a[8]就空了   此时j = 8

0 1 2 3 4 5 6 7 8
24   59 52 72 28 96 33 68

      所以找到a[1] = 68比x = 60 大,a[8] = a [1] = 60

      此时i= 1 ,a[1]为空,所以需要从j=8开始找比x=60小的数

0 1 2 3 4 5 6 7 8
24 33 59 52 72 28 96   68

      找到a[1] = a[7] = 33

     a[7] 空, ,j = 7,从i=1开始找比60大的数

0 1 2 3 4 5 6 7 8
24 33 59 52   28 96 72 68

       a[7] = a[4] =72

         i = 4,a[4] 空

      

   

0 1 2 3 4 5 6 7 8
24 33 59 52 28   96 72 68

    a[4] = a[5]=28,a[5]空

    j = 5

    从 i = 4 开始找比60大的数 就是i = j =  5 终止循环

  所以把 x= 60填入a[5]中

0 1 2 3 4 5 6 7 8
24 33 59 52 28 60 96 72 68

     所以这是第一次循环把所有大于60的数都放到右边,小于的数都放到了左边

   然后继续在 l,到 i -1之间 执行以上步骤

                     i+1 ,r到之间执行以上步骤

void quick_sort2(int a[], int low, int high)
{
	if (low >= high)
	{
		return;
	}
	int first = low;
	int last = high;
	int key = a[first];/*用字表的第一个记录作为枢轴*/

	while (first < last)
	{
		while (first < last && a[last] >= key)
		{
			last--;
		}
		a[first] = a[last];/*将比第一个小的移到低端*/
	
		while (first < last && a[first] <= key)
		{
			first++;
		}

		a[last] = a[first];
		/*将比第一个大的移到高端*/
 	}
	a[first] = key;/*枢轴记录到位*/
	quick_sort2(a, low, first - 1);
	quick_sort2(a, first + 1, high);
}
int main()
{
	int array[] = { 60, 68, 59, 52, 72, 28, 96, 33, 24 };
	int length = sizeof(array) / sizeof(int);
	quick_sort2(array, 0, length - 1);
	for (int i = 0; i < length; i++)
	{	
		cout << array[i]<< endl;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_25858235/article/details/85220039