• 排序(三)-快速排序 [选取不同位置基准数]


    //1.i = L; j = R; 将基准数挖出形成第一个坑a[i]。
    //2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
    //3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
    //4.再重复执行2,3二步,直到i == j,将基准数填入a[i]中。
    #include<iostream>
    #include<algorithm>
    using namespace std;
    void insert_sort(int a[], int n) {       //插入排序
    	int i, j;
    	for (int i = 1; i < n; i++) {
    		int tem = a[i];
    		for (j = i; j > 0 && a[j - 1] > tem; j--)
    			a[j] = a[j - 1];
    		a[j] = tem;
    	}
    }
    void qsort1(int a[], int left, int right)
    {
    	if (left < right) {
    		int i = left, j = right, x = a[left];
    		while (i < j) {
    			while (i < j && a[j] >= x)
    				j--;
    			if (i < j)
    				a[i++] = a[j];
    			while (i < j && a[i] < x)
    				i++;
    			if (i < j)
    				a[j--] = a[i];
    		}
    		a[i] = x;
    		qsort1(a, left, i - 1);
    		qsort1(a, i + 1, right);
    	}
    }
    
    int getcenter(int a[], int left, int right)  //三个数取中位数快排
    {
    	int center = (left + right) / 2;
    	if (a[left] > a[center])
    		swap(a[left], a[center]);
    	if (a[left] > a[right])
    		swap(a[left], a[right]);
    	if (a[center] > a[right])
    		swap(a[center], a[right]);
    	swap(a[center], a[right - 1]);
    	return a[right - 1];
    }
    void qsort2(int a[], int left, int right)
    {
    	int cutoff = 500;
    	if (cutoff <= right - left) {
    	int pivot = getcenter(a, left, right);
    	int i = left,j = right - 1;
    	while (1) {
    		while (a[++i] < pivot);
    		while (a[--j] > pivot);
    		if (j <= i)
    			break;
    		swap(a[i], a[j]);
    	}
    	swap(a[i], a[right - 1]);
    	qsort2(a, left, i - 1);
    	qsort2(a, i + 1, right);
    	}
    	else   // 否则用插入排序 
    		insert_sort(a + left, right - left + 1);
    }
    int main() {
    	int n;
    	int a[1000001];
    	cin >> n;
    	for (int i = 0; i < n; i++)
    		cin >> a[i];
    	qsort2(a, 0, n - 1);
    	for (int i = 0; i < n; i++) {
    		if (i)cout << " ";
    		cout << a[i];
    	}
    }
    
  • 相关阅读:
    bootstrap 导航学习
    算法学习1-插入排序
    管道输入输出流
    1+2*2+3*3+4*4+...+n*n计算
    maven安装for eclipse kepler
    javascript学习7-细节总结
    Git Fetch failed解决办法
    前端学习笔记
    TIOBE 编程语言排行榜
    用VS2012创建和使用WebService
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13109988.html
Copyright © 2020-2023  润新知