• 冒泡排序,插入排序,希尔排序,stl堆排序,归并排序(非递归)


    //这个排序把我整吐了,呕~!
    堆排序讲得很好的例子
    https://blog.csdn.net/qq_36573828/article/details/80261541?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

    
    
    #include<iostream>
    #include<queue>
    using namespace std;
    void maopaosort(int a[], int n) {         //冒泡排序
    	for (int i = 0; i < n - 1; i++) {
    		bool flag = false;
    		for (int j = 0; j < n - 1 - i; j++) {
    			if (a[j + 1] < a[j]) {
    				flag = true;
    				swap(a[j + 1], a[j]);
    			}
    		}
    		if (!flag)
    			break;
    	}
    }
    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 shellsort(int a[], int n) {
    	int i, j;
    	for (int d = n / 2; d > 0; d /= 2) {
    		for (i = d; i < n; i++) {
    			int tem = a[i];
    			for (j = i; j >= d && a[j - d] > tem; j -= d)
    				a[j] = a[j - d];
    			a[j] = tem;
    		}
    	}
    }
    // Sedgewick增量序列哈希排序 
    void Sedgewick_shell_sort(int a[], int n) {
    	int add[] = { 587521,260609,146305,64769,36289,16001,8929,3905,2161,929,505,209,109,41,19,5,1,0 };
    	int i = 0;
    	int j, k;
    	for (int d = add[i]; d > 0; d = add[++i]) {
    		for (j = d; j < n; j++) {
    			int tem = a[j];
    			for (k = j; k >= d && a[k - d] > tem; k -= d)
    				a[k] = a[k - d];
    			a[k] = tem;
    		}
    	}
    }
    //建立最大堆,每次取最大堆根节点与最后一个交换(important)
    void precdown(int a[], int root, int num) {
    	int parent, child;
    	int tmp = a[root];
    	for (parent = root; parent * 2 + 1 < num; parent = child) {
    		child = parent * 2 + 1;
    		if ((child != num - 1) && a[child] < a[child + 1])
    			child++;
    		if (a[child] <= tmp)
    			break;
    		else
    			a[parent] = a[child];
    	}
    	a[parent] = tmp;
    }//建立最大堆的时候从下往上从右到左,后面调整堆是从根节点开始调整
    void heapsort(int a[], int n) {
    	for (int i = n / 2; i >= 0; i--)
    		precdown(a, i, n);
    	for (int i = n - 1; i > 0; i--) {
    		swap(a[0], a[i]);
    		precdown(a, 0, i);
    	}
    }
    //stl堆排序----------------------------------------------------------------------------------
    priority_queue<int>q;
    void stlheapsort(int a[], int n) {
    	for (int i = 0; i < n; i++)
    		q.push(a[i]);
    	for (int i = n - 1; i >= 0; i--) {
    		a[i] = q.top();
    		q.pop();
    	}
    }
    //非递归归并排序
    void merge(int a[], int tem[], int l, int r, int rightend) {
    	int n = rightend - l + 1;
    	int leftend = r - 1;
    	int tmp = l;
    	while (l <= leftend && r <= rightend) {
    		if (a[l] <= a[r])
    			tem[tmp++] = a[l++];
    		else
    			tem[tmp++] = a[r++];
    	}
    	while (l <= leftend)
    		tmp[tem++] = a[l++];
    	while (r <= rightend)
    		tmp[tem++] = a[r++];
    	for (int i = 0; i < n; i++)
    		a[rightend--] = tmp[--tem];
    }
    //一趟归并
    void merge_pass(int a[], int tem[], int n, int length) {
    	int i;
    	for (i = 0; i <= n - 2 * length; i += 2 * length)
    		merge(a, tem, i, i + length, i + 2 * length - 1);
    	if (i + length < n)//归并最后还剩下了两个子列(长度不相等)
    		merge(a, tem, i, i + length, n - 1);
    	else //最后只剩一个子列直接导入
    		for (int j = i; j < n; j++)
    			tem[j] = a[j];
    }
    void merge_sort(int a[], int n) {
    	int length = 1;
    	int* tem = new int[n];
    	if (tem != NULL) {
    		while (length < n) {
    			merge_pass(a, tem, n, length);
    			length *= 2;
    		}
    		delete[] tem;
    	}
    	else cout << "asdad";
    }
    //--------------------------------------------------------
    
    int main() {
    	int n;
    	cin >> n;
    	int a[100000];
    	for (int i = 0; i < n; i++)
    		cin >> a[i];
    	merge_sort(a, n);
    	for (int i = 0; i < n; i++) {
    		if (i)cout << " ";
    		cout << a[i];
    	}
    }
    //```
    
    
  • 相关阅读:
    动态库的链接和链接选项-L,-rpath-link,-rpath
    SSL/TLS 握手过程详解
    数字证书及CA介绍
    sendto函数的坑
    如何捕捉并分析SIGSEGV的现场
    gdb进程调试,多进程调试
    linux下的守护进程daemon
    winform的水印TextBox
    Winform中的TextBox的小技巧
    WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptRes
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13109991.html
Copyright © 2020-2023  润新知