您的位置:首页 > 理论基础 > 数据结构算法

数据结构之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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: