排序算法及实现
来源:互联网 发布:midi伴奏制作软件 编辑:程序博客网 时间:2024/06/06 02:15
排序算法可以总结为如下:
都将数组分为已排序部分和未排序部分。
冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。
插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。
选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。
几种排序算法,可以执行运行
这是测试结果: 希尔排序最快
C 语言shelltime 0.034712selecttime 11.054244bubbletime 27.751209inserttime 15.421586sorttime 8.588640代码实现:#include <stdio.h>#include <stdlib.h>#include <time.h>int a[100000];int b[100000];int c[100000];int d[100000];int e[100000];int n=100000 ;// 产生随机数int outrand(void) // 产生随机数{ int i; srand(time(0)); for(i=0; i < n; i++) { a[i] = rand()%100; b[i] = a[i]; c[i] = a[i]; d[i] = a[i]; e[i] = a[i]; }}// 打印输出void output(int a[],int n){ int i; for (i = 0; i < n; i++) printf("%d, ",a[i]); printf("\n");}// 二分法插入排序void sort(int a[],int n) // 二分法插入排序{ int i, temp, m, d, k; int high,low; for(i = 1; i < n; i++) // 从未排序序列 选择一个 { high = i -1; low = 0; m = high/2; while(high >= low) // 用二分法 查询 { m = (high + low)/2; if(a[m] == a[i]) break; if(a[m] > a[i]) { high = m -1; d = 0; } else if(a[m] < a[i]) { low = m + 1; d = 1; } } for(k = i; m < i-d; m++,k--) // 把i值 插入 { temp = a[k]; a[k] = a[k-1]; a[k-1] = temp; } }}// 插入排序void insertsort(int a[],int n){ int i, j, temp; for (i = 1; i < n ; i++) // 从未排序序列中 选择一个,假定 0 已经是已排序列 for(j = i; j > 0; j--) // 对已排序 序列操作 if(a[j-1] > a[j]) // 相当于冒泡 { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; }}// 希尔排序, 其实就是分组后,在每组中用插入排序,然后再分组,再插入排序void shellsort(int a[],int n){ int i, j, gap; for (gap = n / 2; gap > 0; gap /= 2) // 分组 步长 for (i = 0; i < gap; i++) // 每组都要用插入排序 { for (j = i + gap; j < n; j += gap) if (a[j] < a[j-gap]) { int temp = a[j]; int k = j-gap; while (k >= 0 && a[k] > temp) { a[k + gap] = a[k]; k -=gap; } a[k + gap] = temp; } }}// 选择排序void selectsort(int a[],int n){ int i, j, max ,temp; for (i = 0; i < n-1 ; i++i) // 第一层循环是,把找到的最大值,排到已排序的序列中 { max = i; for(j = i; j < n; j++) // 第二层循环是 从未排序序列中找最大值 if( a[max] < a[j+1]) max =j+1; temp = a[max]; a[max] = a[i]; a[i] = temp; }}// 冒泡排序void bubblesort(int a[],int n){ int i, j, temp; for (i = 0; i < n ; i++) // 第一层循环是 for(j = 0; j < n-i-1;j++) // 两两比对, if(a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; }} // 主函数void main(void){ clock_t start,end; outrand(); start = clock(); shellsort(a,n); end = clock(); printf("shelltime %f \n",(double)(end-start)/1000000); start = clock(); selectsort(b,n); end = clock(); printf("selecttime %f \n",(double)(end-start)/1000000); start = clock(); bubblesort(c,n); end = clock(); printf("bubbletime %f \n",(double)(end-start)/1000000); start = clock(); insertsort(d,n); end = clock(); printf("inserttime %f \n",(double)(end-start)/1000000); start = clock(); sort(e,n); end = clock(); printf("sorttime %f \n",(double)(end-start)/1000000);}
阅读全文
0 0
- 排序算法及实现
- 排序算法实现及分析
- 堆排序算法及实现
- 排序算法实现及分析
- 堆排序算法及实现
- 归并排序算法及实现
- 快速排序算法及实现
- 排序算法总结及实现
- 八大排序算法及实现
- 快速排序算法及实现
- 常见排序算法实现及复杂度分析
- 排序算法实现及复杂度分析(一)
- 排序算法实现及复杂度分析(二)
- 排序算法实现及复杂度分析(三)
- 排序算法及实现(1)
- 排序算法及实现(2)
- 排序算法及实现(3)
- 排序算法思想及Java实现
- caffe随记(八)---使用caffe训练FCN的pascalcontext-fcn32s模型(pascal-context数据集)
- SQL语句详细汇总
- Android 监听ConentProvider的数据改变,ContentObserver
- 解决Ueditor编辑器图片保存路径问题
- Jenkins 2.19.4默认没有Launch agent via Java Web Start,可通过以下来设置:
- 排序算法及实现
- js数据结构之链表
- OpenCV学习笔记17-直方图
- zImage转换为uImage
- 支持向量机通俗导论(理解SVM的三层境界)
- Android布局文件小结
- BASE64Encoder及BASE64Decoder的正确用法
- BZOJ 3224: Tyvj 1728 普通平衡树 pb_ds
- hdu6103