• 快速排序法


    算法思想:

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

    实现原理:

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

      

  • 相关阅读:
    laydate 显示结束时间不小于开始时间
    [Draft]iOS.ObjC.Pattern.Builder-Pattern
    [Draft]iOS.Architecture.16.Truth-information-flow-and-clear-responsibilities-immutability
    iOS.ObjC.__attribute__.1-all-_attribute_-directives
    Security.ssl-pinning
    iOS.mach_msg_trap()
    iOS.redefinition-of-struct-x
    Swift.Operator-and-Items-in-Swift(1)
    iOS.Animation.Math-behind-CATransform3D
    Security.website-that-focus-on-mobile-app-security
  • 原文地址:https://www.cnblogs.com/lyjbk/p/13663281.html
Copyright © 2020-2023  润新知