数据结构之C/C++实现3个插入类排序
2018-07-27 21:56
246 查看
/* 2018年7月27日16:53:00 各类排序算法: 1.插入类:直接插入、二分插入、希尔插入 2.交换类:冒泡排序、快速排序 3.选择类:简单选择、堆排序 4.归并类:二路归并排序 5.分配类:基数排序 */ #include <iostream> #include <string> using namespace std; typedef int ElemType; //插入类排序 //①直接插入 void DirectInsert(ElemType a[], int n) { int i, j;//从下标1开始,0下标存放哨兵元素 for(i=2; i<=n; i++) { //依次与前面有序子表比较,找到位置,然后将哨兵元素放进 if(a[i]<a[i-1]) { a[0] = a[i]; //设置哨兵 for(j=i-1; a[0]<a[j]; j--) { if(a[0]<a[j]) { a[j+1] = a[j]; //向后挪动一个,因为有哨兵,不需要交换,直接覆盖即可 } }//for a[j+1] = a[0]; //将哨兵放进j的位置 } }//for } //②二分插入 /* 思想:将找位置和实现分开,先通过二分查找找到前面有序子表的位置, 然后将该位置后面的元素向后移动一格,然后插入一个该元素。 */ void BinaryInsert(ElemType a[], int n) { int i, j, low, high, mid; for(i=2; i<=n; i++) { if(a[i]<a[i-1]) {//这样效率更高一些(真正的二分插入没有if判断) a[0] = a[i];//放置哨兵 //找位置 low = 1; high = i-1; while(low<=high) { mid = (low+high) / 2; if(a[0]<a[mid]) { high = mid - 1; //左边 } else { low = mid + 1; } }//while cout <<"low="<<low<<" "<<"high=" <<high<<" "<<"mid=" <<mid<<endl; //此时,high<low,将high之后的元素向后移动, //注意:千万不要用mid,因为mid不确定是等于high,还是等于low for(j=i-1; j>=high+1; j--) {//也可以改为j>=low a[j+1] = a[j]; } a[j+1] = a[0]; }//if } } //③希尔排序 /* *思想:通过缩小增量的方式,将每个增量的子表通过直接插入的方式排序 * 当增量变为1时,也就是将整个表通过插入排好了。 */ void SellSort(ElemType a[], int n) { int dk, i, j; for(dk=n/2; dk>=1; dk=dk/2) { //子列表通过直接插入排序 for(i=1+dk; i<=n; ++i) { if(a[i]<a[i-dk]) { a[0] = a[i]; //移动元素 for(j=i-dk; j>0&&a[0]<a[j]; j-=dk) { a[j+dk] = a[j]; //向后挪动一个 }//for a[j+dk] = a[0]; //将哨兵放进j的位置 }//if }//for }//for } //遍历数组 void printArray(ElemType a[], int n) { int i; for(i=1; i<=n; i++) { cout << a[i] <<" "; } } int main() { ElemType a[] = {0, 1, 3, 0, 5, 8, 2, 4, 2, 7, 9, 3, 6, 12, 18, 10, 19}; int n = 16; //DirectInsert(a, n);//插入排序 BinaryInsert(a, n); //二分插入排序 //SellSort(a, n); //希尔排序 printArray(a, n); return 0; }
相关文章推荐
- 数据结构:最短路径(Dijkstra c++实现)
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
- 数据结构_串_串的模式匹配_KMP算法_C++实现
- [数据结构]栈的实现-C++
- 数据结构--约瑟夫环(含密码,C++实现)
- 数据结构与算法之模拟算法 C++实现
- 经典算法与数据结构的c++实现——带头结点的单链表
- [数据结构]七种排序算法的C++简单实现
- 【算法和数据结构】图(一)图的定义和封装(C++实现)
- 数据结构(7) 链队列 c++ 模板实现
- 数据结构之最小堆的实现C++版
- 《C++实现数据结构》:图
- c++数据结构 二叉链表的实现
- C++数据结构: 顺序表 详细实现
- 数据结构 链表的lua实现 仿照C++中list 实现
- 数据结构各种算法实现(C++模板)
- 几种简单的数据结构的C++实现,树,图,链表,环形队列,栈等---环形队列篇
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
- C++实现数据结构-队列
- 【数据结构】用C++实现顺序表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)