数据结构考研 算法直接插入排序 C语言实现

考研-数据结构-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)

要提高查找速度

  1. 减少元素的比较次数

  2. 减少元素的移动次数

//  完整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;
} 

运行结果:

注:希望各位同行批评指正,多多交流,也希望能够帮助广大研友们。

猜你喜欢

转载自blog.csdn.net/kjcxmx/article/details/82110530