使用直接插入排序算法排序实现关键码的由大到小排序,并打印出每趟排序结果。
注意:初始的侯有序区中的元素为第一个元素,其他元素为无序区中的元素。
什么是直接插入排序?
直接插入排序是一种最简单的排序方法,其基本操作是将需要排序的元素插入到已排好的有序表序列中,从而得到一个完整的有序序列。
算法思想
①将待排序序列分为两部分,一部分有序一部分无序。
②我们把第一个元素看作有序序列,从第二个元素到最后为无序序列。
③将无序序列中每一个元素依次插入到有序序列的合适位置–从小到大(从大到小)。
————————————————
特性
1.时间复杂度
最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n ) O(n)O(n)
最坏情况全部反序,内层每次遍历已排序部分,最坏时间复杂度为O ( n 2 ) O(n^2)O(n
2
)
综上,因此直接插入排序的平均时间复杂度为O ( n 2 ) O(n^2)O(n
2
)
2.空间复杂度
辅助空间是常量
平均的空间复杂度为:O ( 1 ) O(1)O(1)
3.算法稳定性
相同元素的前后顺序是否改变
插入到比它大的数前面,所以直接插入排序是稳定的
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <conio.h>
# include <string.h>
# include <math.h>
/****************************************************************************************/
/* 线性表顺序存储结构的定义 */
/****************************************************************************************/
# define LISTINITSIZE 20
# define LISTINCREAMENT 5
# define OK 1
# define ERROR 0
typedef int ElemType;
typedef struct {
ElemType *elem;
int length;
int listsize;
} SeqList;
/****************************************************************************************/
/* 线性表上的几个必要的操作 */
/****************************************************************************************/
int InitList(SeqList *L) { //初始化一个空的顺序表
L->elem=(ElemType *)malloc(sizeof(ElemType)*LISTINITSIZE);
if(!(L->elem))
return ERROR;
L->length=0;
L->listsize=LISTINITSIZE;
return OK;
}
void PrintList(SeqList *L) {
//打印顺序表中的元素
int i;
for(i=1; i<=L->length; i++) {
printf("%d ",L->elem[i]);
}
printf("\n");
}
int InsertList(SeqList *L,int i, ElemType e) {
int j,newspacesize;
ElemType *newbase;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize) {
newspacesize=(L->listsize+LISTINCREAMENT)*sizeof(ElemType);
newbase=(ElemType *)realloc(L->elem,newspacesize);
if(!(newbase))
return ERROR;
L->elem=newbase;
L->listsize+=LISTINCREAMENT;
}
for(j=L->length; j>=i; j--)
L->elem[j+1]=L->elem[j];
L->elem[i]=e;
L->length++;
return OK;
}
/***************************************************************************************/
/* 直接插入排序算法 */
/****************************************************************************************/
void InsertSort(SeqList *L) //直接插入排序
{
int i,j,t,f=0;
for(i=2;i<=L->length;i++){
j=i-1,t=L->elem[i];
while(t>L->elem[j]&&j>=1){
L->elem[j+1]=L->elem[j];
j--;
f=1;
}
if(f==1){
L->elem[j+1]=t;
}
PrintList(L);
}
}
int main()
{
SeqList L;
int i,N,num;
InitList(&L);
scanf("%d",&N);
for(i=1; i<=N; i++)
{
scanf("%d",&num);
InsertList(&L,i,num);
}
InsertSort(&L);
return 0;
}
从小到大:
void InsertSort(SeqList *L) //直接插入排序
{
int i,j,t,f=0;
for(i=2;i<=L->length;i++){
j=i-1,t=L->elem[i];
while(t<L->elem[j]&&j>=1){
L->elem[j+1]=L->elem[j];
j--;
f=1;
}
if(f==1){
L->elem[j+1]=t;
}
PrintList(L);
}
}