概述
插入类排序有直接插入排序、折半插入排序、希尔排序
直接插入排序
算法思想:每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有待排关键字都被插入到有序序列中为止。
工作流程:1)查找出待插入元素应该被插入的位置 2)给插入位置腾出空间,将待插入元素复制到表中的插入位置。
是边比较边移动元素的。
本算法的时间复杂度为:O(n2)
#include <stdio.h>
#include <malloc.h>
#define maxSize 100
int R[maxSize] = { 0 };
int count = 0;
void Indata()
{
int i = 0;
printf("请输入整数数据(按回车键结束输入):");
while (1)
{
scanf_s("%d", &R[i]);
i++;
count++;
char c = getchar();
if ('n' == c)
break;
}
}
void InsertSort(int r[], int n)
{
int i, j;
int temp;
for (i = 1; i < n; i++)
{
temp = r[i]; //将待插入关键字暂存于temp中
j = i - 1;
while (j >= 0 && temp < r[j])
{
r[j + 1] = r[j];
--j;
}
r[j + 1] = temp;
}
printf("n直接插入排序后序列为:");
for (i = 0; i < n; i++)
printf("%d ", r[i]);
}
void main()
{
Indata();
InsertSort(R, count);
system("pause");
}
折半插入排序
和直接插入排序是类似的,只是将比较和移动操作分离出来。即先折半查找出元素的待插入位置,然后再统一地移动待插入位置之后的所有元素
/***********折半插入排序*************/
void InsertSort2(int r[], int n)
{
int i, j, low, high, mid;
int temp;
for (i = 1; i < n; i++)
{
temp = r[i];
low = 0; high = i - 1;
//找到位置
while (low <= high)
{
mid = (low + high) / 2;
if (temp < r[mid])
high = mid - 1;
else
low = mid + 1;
}
//插入
for (j = i - 1; j >= high + 1; j--)
r[j + 1] = r[j];
r[high + 1] = temp;
}
for (i = 0; i < n; i++)
printf("%d ", r[i]);
}
希尔排序
/***********希尔排序***********/
void ShellSort(int r[], int n)
{
int i, j, temp, gap;
int m;
for (gap = n / 2; gap > 0; gap = gap / 2)
{
for (i = gap; i < n; i++)
{
temp = r[i];
for (j = i; j >= gap && r[j - gap] > temp; j -= gap)
r[j] = r[j - gap];
r[j] = temp;
}
}
for (m = 0; m < n; m++)
printf("%d ", r[m]);
}
最后
以上就是迷你小霸王为你收集整理的数据结构---插入类排序(直接插入排序、折半插入排序、希尔排序,C语言)的全部内容,希望文章能够帮你解决数据结构---插入类排序(直接插入排序、折半插入排序、希尔排序,C语言)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复