排序小结(二)
来源:互联网 发布:中国微观数据库 编辑:程序博客网 时间:2024/05/21 01:29
排序小结(二)
STL的sort基于快速排序,抛开处理器的影响不谈,它是一种复杂度为O(nlogn)的高效排序方法。
另外,sort还对快速排序的最坏情况添加了应对机制,克服了其在最坏情况下复杂度高达O(n²)的缺点
但要注意,sort属于不稳定的排序算法
在需要稳定的排序算法时,我们可以选用以并归排序为基础的stable_sort。
只不过stable_sort的复杂度虽然也O(nlogn),但比sort需求的内存更多,速度也稍慢。
//并归排序(稳定的排序算法,时间复杂度O(nlogn))#include<iostream>using namespace std;#define MAX 500000#define SENTINEL 2000000000int L[MAX / 2 + 2], R[MAX / 2 + 2];int cnt;void merge(int A[], int n, int left, int mid, int right) {int n1 = mid - left;int n2 = right - mid;for (int i = 0; i < n1; i++)L[i] = A[left + i];for (int i = 0; i < n2; i++)R[i] = A[mid + i];L[n1] = R[n2] = SENTINEL;int i = 0, j = 0;for (int k = left; k < right; k++) {cnt++;if (L[i] <= R[i]) {A[k] = L[i++];}else {A[k] = R[j++];}}}void mergeSort(int A[],int n,int left,int right) {if (left + 1 < right) {int mid = (left + right) / 2;mergeSort(A, n, left, mid);mergeSort(A, n, mid, right);merge(A, n, left, mid, right);}}int main() {int A[MAX], n, i;cnt = 0;cin >> n;for (i = 0; i < n; i++)cin >> A[i];mergeSort(A, n, 0, n);for (i = 0; i < n; i++) {if (i)cout << " ";cout << A[i];}cout << endl;cout << cnt << endl;return 0;}
//分割问题(以数组最后一个元素为中间数,将小于该数的放左边,大于该数的放右边)//时间复杂度O(n)#include<stdio.h>#define MAX 100000int A[MAX], n;int partition(int p, int r) {int x, i, j, t;x = A[r];i = p - 1;for (j = p; j < r; j++) {if (A[j] <= x) {i++;t = A[i]; A[i] = A[j]; A[j] = t;}}t = A[i + 1]; A[i + 1] = A[r]; A[r] = t;return i + 1;}int main(){int i, q;scanf("%d", &n);for (i = 0; i < n; i++)scanf("%d", &A[i]);q = partition(0, n - 1);for (i = 0; i < n; i++){if (i)printf(" ");if (i == 0)printf("]");printf("%d", A[i]);if (i == q)printf("]");}printf("\n");return 0;}
//计数排序(只要从输入数组A的末尾元素开始选择,计数排序就属于稳定的排序算法。)//平均时间复杂度O(n+k)//以下代码以数组A非负为前提,其运行所需的时间及内存空间也与数组A中的最大值成正比#include<stdio.h>#include<stdlib.h>#define MAX 2000001#define VMAX 10000int main() {unsigned short *A, *B;int C[VMAX + 1];int n, i, j;scanf("%d", &n);A = (unsigned short *)malloc(sizeof(short)*n + 1);B = (unsigned short *)malloc(sizeof(short)*n + 1);for (i = 0; i <= VMAX; i++){scanf("%hu", &A[i + 1]);//%hu代表以unsigned short格式输出C[A[i + 1]]++;}for (i = 1; i <= VMAX; i++)C[i] = C[i] + C[i - 1];for (j = 1; j <= n; j++) {if (i > 1) printf(" ");printf("%d", B[i]);}printf("\n");return 0;}
STL的sort基于快速排序,抛开处理器的影响不谈,它是一种复杂度为O(nlogn)的高效排序方法。
另外,sort还对快速排序的最坏情况添加了应对机制,克服了其在最坏情况下复杂度高达O(n²)的缺点
但要注意,sort属于不稳定的排序算法
在需要稳定的排序算法时,我们可以选用以并归排序为基础的stable_sort。
只不过stable_sort的复杂度虽然也O(nlogn),但比sort需求的内存更多,速度也稍慢。
0 0
- 排序小结(二)
- 排序小结 (上)
- 排序小结(一)
- 【软件工程】小结(二)
- SQL小结(二)
- C#小结(二)
- 线程小结(二)
- java 小结 (二)
- 小结SpringMVC(二)
- 面试小结(二)
- JavaScript小结(二)
- Ehcache小结(二)
- MySQL 小结(二)
- C++小结(二)
- 小结(二)
- Spring 小结(二)
- 排序算法小结(1) 插入排序
- 排序算法小结(2)选择排序
- Jquery-Dom和css操作
- python如何设置中文 utf-8
- Rials实现下拉框联动的两种实现方式
- Zigbee协议栈(CC2530开发板) 修改发射功率
- android网页打印,安卓网页打印,h5页面打印,浏览器打印,js打印工具
- 排序小结(二)
- Nginx反向代理与负载均衡
- 进程间通信系列(3)匿名管道范例代码
- 今日头条2017春招研发岗笔试题——Paragraph
- POJ
- Android之冷启动和热启动,以及代码
- MySql基础
- C# 消息处理学习总结
- 实现24点游戏-穷举法