各类排序比较
来源:互联网 发布:nginx 添加ip黑名单 编辑:程序博客网 时间:2024/05/17 23:42
在写完了各个排序的具体介绍后,现在对各种排序的具体时间做一下比较,形象的看看各个排序的性能(如果对里面具体哪个排序算法不太了解,可以参看博主有关文章)
#include <stdio.h>#include <stdlib.h>#include <iostream>#include <algorithm>#include <time.h>using namespace std;//直接插入排序void insert_sort(int* a, int n){for (int i = 1; i < n; ++i){int j = i - 1;int temp = a[i];while (j >= 0 && a[j] > temp){a[j + 1] = a[j];--j;}a[j + 1] = temp;}}//希尔排序void shell_sort(int* a, int n){int gap = n / 2;while (gap != 0){for (int i = gap; i < n; ++i){int j = i - gap;int temp = a[i];while (j >= 0 && a[j] > temp){a[j + gap] = a[j];j = j - gap;}a[j + gap] = temp;}gap = gap / 2;}}//冒泡排序void bubble_sort(int* a, int n){for (int i = 0; i <= n - 1; ++i){int flag = 1;for (int i = 0; i <= n - i - 1; ++i){if (a[i] > a[i + 1]){int t = a[i];a[i] = a[i + 1];a[i + 1] = t;flag = 0;}}if (flag == 1){break;}}}//选择排序void select_sort(int* a, int n){for (int i = 0; i < n; ++i){int k = i;for (int j = i + 1; j < n; ++j){if (a[k] > a[j]){k = j;}}if (k != i){int t = a[k];a[k] = a[i];a[i] = t;}}}//快速排序void quick_sort(int* a, int left, int right){if (left >= right){return;}int i = left;int j = right;int temp = a[left];while (i < j){while (j > i && temp <= a[j])--j;while (i < j && temp >= a[i])++i;if (i != j){int t = a[i];a[i] = a[j];a[j] = t;}}a[left] = a[i];a[i] = temp;quick_sort(a, left, i - 1);quick_sort(a, i + 1, right);}void swap(int* h, int m, int n){int t;t = h[m];h[m] = h[n];h[n] = t;}//堆排序void siftdown(int* h, int i, int n){int flag = 0, t;while (2 * i <= n && flag == 0){if (h[i] > h[2 * i])t = i;elset = 2 * i;if (2 * i + 1 <= n)if (h[2 * i + 1] > h[t])t = 2 * i + 1; if (t != i){swap(h, t, i);i = t;//方便继续向下调整}elseflag = 1;}}void creat(int* h, int n){int i;for (i = n / 2; i >= 1; i--)siftdown(h, i, n);}void heap_sort(int* h, int n){while (n > 1)//直到n = 1 即只剩下最后一个数字没有操作,此时也没有必要操作了{swap(h, 1, n);//最大堆的第一个数字最大,把该最大数移到数组的而最后一个数字去 n--; siftdown(h, 1, n);//把第一个数字重新更新为最大数}}//归并排序void merge(int* a, int low, int mid, int high){ int i = low, j = mid + 1, k = 0; int *b = (int* )malloc((high - low + 1) * sizeof(int)); while (i <= mid && j <= high) { if (a[i] > a[j]) { b[k] = a[i]; ++i; ++k; } else { b[k] = a[j]; ++j; ++k; } } while (i <= mid) { b[k] = a[i]; ++i; ++k; } while (j <= high) { b[k] = a[j]; ++j; ++k; } for (i = low, k = 0; i <= high; ++i, ++k)//注意这里i的初值是low而不是0 a[i] = b[k]; //循环终止条件时i <= high而不是i < high free(b);}void mergepass(int* a, int length, int n){ int i; for (i = 0; i + 2 * length - 1 < n; i = i + 2 * length) { merge(a, i, i + length - 1, i + 2 * length - 1); } if (i + length - 1 < n) merge(a, i, i + length - 1, n - 1);}void merge_sort(int* a, int n){ for (int length = 1; length < n; length = 2 * length) mergepass(a, length, n);}//产生随机数int rnd(){return rand() % (1000 - 10 + 1) + 10;}void print(int* a, int n){for (int i = 0; i < n; ++i){printf("%d ", a[i]);}printf("\n");}int main(){int* a, n;while (~scanf("%d", &n)) //输入需要排列的元素个数{a = (int* )malloc(n * sizeof(int));srand((unsigned)time(NULL));generate_n(a, n, rnd); //用随机数产生数组个数clock_t start, finish; //程序排序开始时间与结束时间start = clock(); //记录下排序前的时间sort(a, a + n); //这里测试c++里面自带的sort函数finish = clock(); //记录排序结束的时间printf("STL SORT time is: %0.8lf\n", double(finish - start)); //差值即为排序需要时间random_shuffle(a, a + n); //这里必须随机打乱数组元素start = clock();insert_sort(a, n);finish = clock();printf("INSERT SORT time is: %0.8lf\n", double(finish - start));random_shuffle(a, a + n);start = clock();select_sort(a, n);finish = clock();printf("SELECT SORT time is: %0.8lf\n", double(finish - start));random_shuffle(a, a + n);start = clock();bubble_sort(a, n);finish = clock();printf("BUBBLE SORT time is: %0.8lf\n", double(finish - start));random_shuffle(a, a + n);start = clock();shell_sort(a, n);finish = clock();printf("SHELL SORT time is: %0.8lf\n", double(finish - start));random_shuffle(a, a + n);start = clock();quick_sort(a, 0, n - 1);finish = clock();printf("QUICK SORT time is: %0.8lf\n", double(finish - start));random_shuffle(a, a + n);start = clock();creat(a, n - 1);heap_sort(a, n - 1);finish = clock();printf("HEAP SORT time is: %0.8lf\n", double(finish - start));random_shuffle(a, a + n);start = clock();creat(a, n);merge_sort(a, n);finish = clock();printf("MERGE SORT time is: %0.8lf\n", double(finish - start));free(a);}return 0;}
阅读全文
0 0
- 各类排序比较
- 各类排序算法比较表
- 算法12:各类排序比较
- 各类排序算法的比较
- 排序(3)--各类排序算法的比较
- 各类排序算法的比较[摘抄]
- 各类排序算法比较(C++)
- 各类排序算法的比较总结
- 各类排序算法复杂度、稳定性比较
- 各类排序算法比较和应用场景
- 常见排序算法(零)(各类排序算法总结与比较)
- 各类MQ比较
- 各类MQ产品比较
- 各类MQ比较
- 各类MQ比较
- leecode 169. Majority Element(C语言,快速排序,堆排序,各类排序算法复杂度比较)22
- 各类排序算法的时间复杂度和空间复杂度的比较表
- 南邮数据结构实验4 各类排序算法实现与比较
- spring如何可以同时访问静态资源和Action
- [Android]圆角视图
- 为什么程序员的工资那么高
- 软件定义网络 ---openflow交换机的实现
- iOS 中 常用的第三方库
- 各类排序比较
- 深入浅出剖析MVP架构模式
- 函数的参数传递
- 对工作有帮助的XSLT文章
- 为什么anaconda安装成功之后无法打开Ipython以及spyder
- python爬从设计:Requests库入门
- 关于先后两个方法从后台获取数据,传参报空的问题
- java,字符串操作
- java对象排序