【插入排序】直接,折半,二路,希尔
2015-06-17 13:13
204 查看
插入排序 给出一下四种方法:
直接插入排序,折半插入排序,二路插入排序,希尔插入排序
代码实现:
输出结果:
直接插入排序,折半插入排序,二路插入排序,希尔插入排序
代码实现:
#include<iostream> using namespace std; #define size 21 typedef int Sqlist[size]; void SInsertSort(Sqlist &L, int n) //直接插入 { cout << "直接插入排序" << endl; for (int i = 2; i < n; ++i) { if (L[i] < L[i - 1]) //判断i与i-1位置的大小 { L[0] = L[i]; //将i位置赋值给哨兵位 int j; for (j = i - 1; L[0] < L[j]; --j) { L[j + 1] = L[j]; //循环后移 } L[j + 1] = L[0]; } } } void BInsertSort(Sqlist &L, int n) { cout << "折半插入排序" << endl; for (int i = 2; i < n; ++i) { L[0] = L[i]; int low = 1; int high = i - 1; int mid = 0; while (low <= high) { mid = (low + high) / 2; if (L[0] < L[mid]) { high = mid - 1; } else { low = mid + 1; } } for (int j = i - 1; j >= high + 1; --j) { L[j + 1] = L[j]; //循环后移 } L[high + 1] = L[0]; } } void TWInsertSort(Sqlist &L, int n) //2—路插入排序 { cout << "二路插入排序" << endl; Sqlist T; T[0] = L[0]; int first; int last; first = last = 0; for (int i = 1; i < n; ++i) { if (L[i] < T[first]) { first = (first - 1 + n) % n; T[first] = L[i]; } else if (L[i] > T[last]) { last++; T[last] = L[i]; } else { last++; T[last] = T[last - 1]; int j = last - 1; for (; L[i] < T[(j - 1 + n) % n]; j = (j - 1 + n) % n) { T[j] = T[(j - 1 + n) % n]; } T[j] = L[i]; } } for (int i = 0; i < n; ++i) { L[i] = T[first]; first = (first + 1) % n; } } void ShellInsert(Sqlist &L, int n, int dk)//希尔插入 { int t; for (int i = dk + 1; i <= n; ++i) //按增量变化 { if (L[i] < L[i - dk]) //比较大小 { t = L[i]; int j = i - dk; for (; j>0 && t<L[j]; j -= dk) { L[j + dk] = L[j]; } L[j + dk] = t; //赋值 } } } void ShellSort(Sqlist &L, int n, int dlta[], int t)//希尔排序 { for (int k = 0; k < t; ++k) //按照增量数组值重复插入排序 { ShellInsert(L, n, dlta[k]); } } void main() { Sqlist sq = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//0为哨兵位 cout << "原数组为:" << endl; for (int i = 1; i < 9; ++i) { cout << sq[i]<<' '; } cout << endl; SInsertSort(sq,9); for (int i = 1; i < 9; ++i) { cout << sq[i] << ' '; } cout << endl; BInsertSort(sq, 9); for (int i = 1; i < 9; ++i) { cout << sq[i] << ' '; } cout << endl; Sqlist Sq = { 49, 38, 65, 97, 76, 13, 27, 49 }; cout << "原数组为:" << endl; for (int i = 0; i < 8; ++i) { cout << Sq[i]<<' '; } cout << endl; TWInsertSort(Sq, 8); for (int i = 0; i < 8; ++i) { cout << Sq[i] << ' '; } cout << endl; Sqlist sQ = { 0, 49, 38, 65, 97, 76, 13, 27, 49 };//哨兵位 cout << "原数组为:"<<endl; for (int i = 1; i <= 8; ++i) //打印sQ { cout << sQ[i] << " "; } cout << endl; int dlta[] = { 5, 3, 1 }; //增量数组 ShellSort(sQ, 8, dlta, sizeof(dlta) / sizeof(int));//希尔排序 cout << "希尔排序:" << endl; for (int j = 1; j <= 8; ++j) { cout << sQ[j] << " "; } cout << endl; }
输出结果:
相关文章推荐
- Jquery 获得单选按钮组中选中的值
- 收藏:解决其它程序与IIS共享80端口的四个方法
- 欢迎使用CSDN-markdown编辑器
- 黑马程序员----Java基础之集合类(一)
- conjugate gradient method (共轭梯度法)
- GCD 只执行一次
- Java:在不同界面样式下JPopupMenu与鼠标事件mousePressed表现的结果不同!
- conjugate gradient method (共轭梯度法)
- ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。
- unbuntu软件卸载,安装等操作
- display:inline、block、inline-block的区别
- 从URL获取文件保存到本地的JAVA代码
- Android 之布局
- GRE写作题库:传媒类
- iOS开发的一些奇巧淫技3
- iOS开发的一些奇巧淫技2
- poj2608---几个字母映射到同一个数字
- 多线程状态下调用SimpleDateFormat.format()抛出 ArrayIndexOutOfBoundsException 异常
- iOS开发的一些奇巧淫技 1
- 【uiautomator】UiSelector