zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序是一种分治的思想。

    每次快速排序的时候,都是用第一个数来比较的,然后设置两个指针,一个i 一个 j ,一个指向首位,一个指向末尾。

    然后从末尾开始比较,如果 a [ j ] 大于a [ 0 ] 的话那就让j--,直到后面的数有一个小于 a [ 0 ],然后开始进行 i 指针的比较,如果 a [ i ] 小于 a [ 0 ] 的话,就让i++,直到前面的数有一个大于 a [ 0 ],然后让 a [ i ] 和

    a [ j ] 进行交换 。

    这样一直到i=j,第一轮交换结束。

    这样的话第一轮的排序就已经完成了,a i 的位置左边就都是小于 a i 的数字,右边都是大于 a i 的数字。

    显而易见,再次进行下次排序,直到递归数组长度为一的时候就已经不用再排序了,这时候数组已经排好序了。

    对于这个排序的复杂度是 n* log n 的

    因为假设有 k 层 每层分的时候都是按比例分的,比如十分之九,那就是 (十分之九乘以n)的k次方 就等于 1,

    因为最底层大小为1,那 k 就等于 log (9n/10)^1 ,这样就约等于log n ,每层的话划分又是O(n)的复杂度,乘起来就是了。

    #include <iostream>
    using namespace std;
    
    void QuickSort(int a[],int s,int e)
    {
    	if (s>=e)
    		return ;
    		int k=a[s];
    		int i=s,j=e;
    		while (i!=j) {
    			while (j>i&&a[j]>=k) {
    				j--;
    			}
    			swap(a[i],a[j]);
    			while (i<j&a[j]<=k) {
    				i++;
    			}
    			swap(a[i],a[j]);
    		}
    		QuickSort(a,s,i-1);
    		QuickSort(a,i+1,e);
     } 
     
    int main()
    {
    	int a[10];
    	int k=100;
    	for (int i=9;i>=0;i--) {
    		a[i]=k++;
    	}
    	QuickSort(a,0,9);
    	for (int i=0;i<10;i++) {
    		cout<<a[i]<<" ";
    	}
    	return 0;
    }
  • 相关阅读:
    FZU 2112 并查集、欧拉通路
    HDU 5686 斐波那契数列、Java求大数
    Codeforces 675C Money Transfers 思维题
    HDU 5687 字典树插入查找删除
    HDU 1532 最大流模板题
    HDU 5384 字典树、AC自动机
    山科第三届校赛总结
    HDU 2222 AC自动机模板题
    HDU 3911 线段树区间合并、异或取反操作
    CodeForces 615B Longtail Hedgehog
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12328909.html
Copyright © 2011-2022 走看看