考研-数据结构-C-算法-数组-排序-直接插入
语言:C语言
对一维数组的直接插入排序,过程函数化。
什么是直接插入排序?
直接插入排序就是将某一个元素与顺序表中元素进行比较,然后插入到相应的位置,使整个顺序表处于有序状态。
对于插入排序,有三种方法:1. 直接插入排序2. 二分插入排序3.希尔排序
1.为了方便阅读、理解,采取初始化数组的形式输入。当然也是可以放一个输入函数,将数据从命令框中或者直接调用文件函数,从文件中读取,从而获取待排序的数据。
2.再者就是可以更改存储类型,定义一个LinkType的数据结构,将数据放在链表中。只是存储结构不同,算法的思想是一样的。
3.没有写C++或者Java的版本,算法的核心都是一样的,只要理解了核心思想,剩下的就是不同语言的表达了。
// 排序函数
int InsertSortFun(int array[],int length)
{
int temp;
int k;
for(k=1;k<length;k++) //从数组的第二个元素开始,终止于数组长度
{
temp=array[k]; //存放抽出来的元素A
int j=k;
while(j>0&&array[j-1]>temp) //如果前一个元素大于A元素
{
array[j]=array[j-1]; //前一个元素往后移
j--;
}
array[j]=temp; //当前位置的原元素已往后移,把A元素填入
}
}
实现排序的基本操作有两个:
(1)“比较”序列中两个关键字的大小;
(2)“移动”记录。
性能分析:
最好的情况(关键字在记录序列中顺序有序):
“比较”的次数: | “移动”的次数: |
0 |
最坏的情况(关键字在记录序列中逆序有序):
“比较”的次数: | “移动”的次数: |
原始数据越接近有序,排序速度越快
最坏情况下(输入数据是逆有序的) Tw(n)=O(n2)
平均情况下,耗时差不多是最坏情况的一半 Te(n)=O(n2)
要提高查找速度
-
减少元素的比较次数
-
减少元素的移动次数
// 完整C代码
#include <stdio.h>
#include <stdlib.h>
#define arraysize 5
int InsertSortFun(int array[],int length)
{
int temp;
int k;
for(k=1;k<length;k++) //从数组的第二个元素开始,终止于数组长度
{
temp=array[k]; //存放抽出来的元素A
int j=k;
while(j>0&&array[j-1]>temp) //如果前一个元素大于A元素
{
array[j]=array[j-1]; //前一个元素往后移
j--;
}
array[j]=temp; //当前位置的原元素已往后移,把A元素填入
}
}
void PrintArray(int array[]){ //打印数组的函数
for(int i =0;i < arraysize ;i++)
printf("%d ",array[i]);
}
int main(){
int array[arraysize] = {1,3,3,5,4}; //初始化数组
InsertSortFun(array,arraysize); //调用排序函数
PrintArray(array); //打印数组,进行输出
return 0;
}