zoukankan      html  css  js  c++  java
  • 分治法——快速排序(quicksort)

    先上代码

    #include <iostream>
    using namespace std;
    
    int partition(int a[],int low, int high)
    {
    	int pivot = a[low], i = low, j = high;
    	while(i < j)
    	{
    		while(i < j && pivot <= a[j])
    			j--;
    		if(i < j)  swap(a[i++],a[j]);
    		while(i < j && pivot >= a[i])
    			i++;
    		if(i < j) swap(a[j--],a[i]);
    	}
    	return j;
    }
    
    
    void quicksort(int a[],int low, int high)
    {
    	int pivotpos;
    	if(low < high)
    	{
    		pivotpos = partition(a,low,high);
    		quicksort(a,low,pivotpos);
    		quicksort(a,pivotpos+1,high);
    	}
    }
    
    
    int main()
    {
    	int arr[10] = {1,22,3,4,5,6,77,18,99,10};
    	quicksort(arr,0,9);
    	for(int i = 0; i < 10; i++)
    		cout<<arr[i]<<" ";
    	cout<<"
    "; 
    	return 0;
     } 
    

     在上篇博客,归并排序里面提到的分治法三步骤。分、治、合并。

    快速排序里面主要步骤是第一步,划分。

    首先取序列里面的第一个元素作为基准 pivot,然后将序列划分为两部分,一部分大于 pivot,一部分小于 pivot。( pivot = a[low] )

    划分的具体办法:定义两根指针 i 和 j,i 从序列的最左边开始往右,j 从序列的最右边往左。当 i < j 的时候进行一下操作:

    1基准pivot的位置和 i 的位置是相同的。这种情况下,就应该对 j 进行操作。 当  arr[j] >= pivot 的时候,直接 j - -。直到不符合这个条件的时候就交换基准和 a[j] 的的值,这个时候基准也就是 a[j]。

    2基准的位置和 j 的位置是相同的。这种情况下,就应该对 i 进行操作。 当  arr[i] <= pivot 的时候,直接 i ++。直到不符合这个条件的时候就交换基准和 a[i] 的的值,这个时候基准的位置又是 i 的位置。

    就可以重复1步骤。然后继续运行循环执行 1、2 操作。

    当 i 和 j 相等的时候,返回 i 或者 j 的值。就是划分的区间位置。

    按照这种方法不断地划分序列,到最后序列只有一个元素的时候,合并序列,合并后的序列就是有序的。

  • 相关阅读:
    leetcode-594-Longest Harmonious Subsequence
    leetcode-581-Shortest Unsorted Continuous Subarray
    leetcode-575-Distribute Candies(计算一个数组中元素的种类的快速方法)
    leetcode-566-Reshape the Matrix
    leetcode-561-Array Partition I
    leetcode-551-Student Attendance Record I(判断是否出现连续几个相同字符)
    Java之CheckedException
    Java异常机制
    Zookeeper分布式协调即分布式锁机制
    Spring中@Value用法
  • 原文地址:https://www.cnblogs.com/stul/p/10481298.html
Copyright © 2011-2022 走看看