直接插入排序:是一种最简单的排序方法。
直接插入排序基本原理:它的基本操作就是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。也就是说,直接插入排序将待排序序列分成两部分,一部分是有序序列,一部分是无序的。将无序序列的数添加到有序序列中,待无序序列长度为0是,直接插入排序结束。
在直接插入排序过程中一共进行n-1趟插入,即:先将序列表中的第一个记录看成是有序的子序列,然后从第二个记录起逐个插入,直至整个序列变成按关键字非递减有序序列为止。
具体JAVA实现算法为:
package com.simpleInert.sort;
public class SimpleInsertSort {
/*几个注意点
* 1.外层循环只能循环n-1次
* 2.内层循环易错点比较多,主要是判断条件,一定是j>=0
* 并且sortArray[j]>temp;j--
* 3.sortArray[j+1]=temp ;一定是j+1
* 是因为当退出内层循环的时候j--了一次。
* */
public int[] data ;
public void sort(int [] sortArray){
for(int i = 1;i<sortArray.length;i++){ //控制n-1趟插入排序
int temp = sortArray[i],j ;//将当前要插入的元素记录下来,这样防止下面后移覆盖次数
for(j=i-1;j>=0&& sortArray[j]>temp;j--){//循环比较,这个比较是从i开始,即从有序列的后面往前比较
sortArray[j+1]=sortArray[j];
}//内存循环
sortArray[j+1]=temp ;
}//外层循环
}//sort方法
public void display(){
for (int a : data) {
System.out.print(a);
System.out.print(" ");
}
}
}
算法性能分析:从空间看:只需一个辅助空间,从时间上看:排序的基本操作为比较和移动。为O(n*n)
C语言实现过程:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int KeyType ;
typedef char InfoType ;
typedef struct {
KeyType key ;
InfoType otherInfo ;
}RedType;//记录的类型
typedef struct{
RedType r[MAXSIZE+1] ;//0号单元设置哨兵
int length ; //顺序表的长度
}SqList;
void InsertSort(SqList &L);
void Print(SqList L) ;
void main(){
SqList L ;
L.r[1].key = 49 ;
L.r[2].key = 38 ;
L.r[3].key = 65 ;
L.r[4].key = 97 ;
L.r[5].key = 76 ;
L.r[6].key = 13 ;
L.r[7].key = 27 ;
L.r[8].key = 49 ;
L.length = 8;
InsertSort(L);
Print(L);
}
void InsertSort(SqList &L){
int i,j ;
for(i = 2;i<=L.length;i++){
if(L.r[i].key<L.r[i-1].key){
L.r[0] = L.r[i];
for(j=i-1;L.r[j].key>L.r[0].key;j--){
L.r[j+1]=L.r[j];
}
L.r[j+1]=L.r[0];
}
}
}
void Print(SqList L){
int i ;
for(i=1;i<=L.length;i++){
printf("%d\t",L.r[i].key);
}
}