初级排序方法——选择、插入、希尔排序
来源:互联网 发布:linux怎么安装输入法 编辑:程序博客网 时间:2024/05/16 12:41
初级排序方法是最基本的排序方法,主要包括选择排序、插入排序以及希尔排序。
选择排序的原理是通过比较整个数组,找到最小值,然后将最小值与数组中第一个位置的数字进行交换,依靠循环来完成对整个数组的排序。对于一个由N个元素组成的数组,这种方法进行(N^2)/2次比较和N次交换,并且无论输入是什么情况,其比较和交换次数不变。
插入排序的原理则是比较该元素与其之前元素的大小,若偏小则交换位置,继续与新位置之前的元素进行比较,直到偏大为止,同样依靠循环来对整个数组进行排序。这种方法十分依赖输入,若输入的就是一组排好序的数组,则其进行N-1次比较和0次交换;若输入是最坏情况,则进行(N^2)/2次比较和(N^2)/2次交换。但平均而言,进行(N^2)/4次比较和(N^2)/4次交换,,一般而言是快于选择排序的。
希尔排序则在插入排序的基础上更进一步。它是通过将一个大数组分割成几个小数组,每个小数组的各个元素相隔h个元素,然后对每个小数组进行插入排序,完成后缩小h重复上述步骤,直到h<1。
三种排序方法c++代码如下:
template<typename T>void _swap(T *t, int i, int j) //交换两个元素{ T k; k = t[i]; t[i] = t[j]; t[j] = k;}template<typename T>void selection_sort(T *t) //选择排序{ int N = sizeof(t) / sizeof(t[0]); //确定数组大小 for(int i = 0; i < N; i++) { int _min = i; for(int j = i + 1; j < N; j++) //寻找位置i及i右侧数组的最小值 { if(t[_min] > t[j]) { _min = j; } } _swap(t, i, _min); //交换i元素和最小元素 }}template<typename T>void insertation_sort(T *t) //插入排序{ int N = sizeof(t) / sizeof(t[0]); for(int i = 1; i < N; i++) //哨兵:先找到最小值并放在t[0]处,用来避免边界判定 { int _min = 0; if(t[i] < t[_min]) _min = i; _swap(t, 0, _min); } for(int i = 1; i < N; i++) //如果t[j]<t[j-1],则交换,直到t[j]>=t[j-1] { for(int j = i; t[j] < t[j-1]; j--) _swap(t, j, j-1); }}template<typename T>void shell_sort(T *t) //希尔排序{ int N = sizeof(t) / sizeof(t[0]); int h = 1; while(h < N/3) h = h * 3 + 1; //h=1,4,13,40...... while(h > 0) { for(int i = h; i < N; i++) for(int j = i; j > h && t[j] < t[j-h]; j -= h) _swap(t, j, j-h); h /= 3; }}
0 0
- 初级排序方法——选择、插入、希尔排序
- 初级排序算法(选择排序、插入排序、希尔排序)
- 初级排序-选择排序、插入排序、希尔排序总结
- 算法 —— 选择排序,插入排序,希尔排序
- 插入排序—希尔排序
- 初级排序算法(选择排序+插入排序+希尔排序)动态可视化实现
- 比较排序总结——直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序
- 选择排序、插入排序、希尔排序
- 选择排序&插入排序&希尔排序
- 选择排序,插入排序,希尔排序
- 选择排序、插入排序、希尔排序总结
- 希尔排序,选择排序,插入排序 java
- 常用的排序算法性能分析(1)—— 选择排序、插入排序、希尔排序
- 常见排序方法(冒泡排序、选择排序、插入排序、希尔排序和快速排序)
- 算法与数据结构——选择,插入,希尔排序
- 排序算法(1)—选择,插入,希尔
- 冒泡--选择--插入--希尔排序
- 初级排序算法之冒泡、选择、插入、希尔排序(附Java实现和分析)
- OptionMenu(选项菜单)
- 第九周OJ总结<5>- 大帆玩英雄联盟
- Markdown实用语法参考
- Eclipse配置Maven,Tomcat常见问题
- 中英文对照 —— 宗教 & 哲学
- 初级排序方法——选择、插入、希尔排序
- JAVA中的反射机制
- 网络编程之TCP协议
- C++ const char* 常量字符串拼接问题
- 自定义ProgressDialog
- 安卓广播
- Day47:CSA meeting
- 第一行代码笔记3
- 使用控件时提示"未声明标识符"的解决方法