【插入排序】直接,折半,二路,希尔
来源:互联网 发布:流星网络电视app 编辑:程序博客网 时间:2024/05/15 12:05
插入排序 给出一下四种方法:
直接插入排序,折半插入排序,二路插入排序,希尔插入排序
代码实现:
- #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;
- }
输出结果:
0 0
- 【插入排序】直接,折半,二路,希尔
- 【插入排序】直接,折半,二路,希尔
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 插入排序(希尔排序、直接插入、折半插入排序)
- 直接插入排序,折半插入排序,2-路插入排序,希尔排序
- 插入排序:直接插入排序,折半查找排序,希尔排序
- 排序算法--直接插入排序、折半插入排序、希尔排序
- 插入排序:直接插入, 折半插入,希尔插入
- 直接插入排序 && 折半插入排序 && 希尔排序
- 直接插入排序,折半插入排序,希尔排序
- 直接插入排序、折半插入排序、希尔排序
- 插入排序(直接插入,折半插入,希尔)
- 各种常用的插入排序(直接,折半,希尔)
- 各种排序算法汇总(插入排序:直接插入排序、折半插入排序、希尔排序)
- 内部排序之插入排序:直接插入排序,折半插入排序,希尔排序
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 排序算法——插入排序(直接插入排序、折半插入排序、希尔排序)
- Metaio in Unity3d 教程--- 一. 搭建环境,运行官方案例
- java分页查询(oracle)dao样例
- 深度学习在图像识别中的研究进展与展望【王晓刚】
- 傅里叶变换
- Linux 下的文件加密
- 【插入排序】直接,折半,二路,希尔
- 算法-哈希表
- [漏洞分析] WordPress History Collection <=1.1.1 Arbitrary File Download
- 关闭 Mac 版 Chrome 自动更新的方法
- 学习Python6(临时计算器+字符串编码)
- PHP网站实现地址URL重定向
- spring获取applicationContext.xml中bean内容
- opengl 4.X (离屏渲染-后台渲染)off-screen rendering
- MFC,QT与WinForm,WPF简介