C语言实现直接插入排序
一、动态数组实现即输即排
1.定义动态数组
#define InitSize 25
typedef struct {
int * data;
int MaxSize;
int length;
} DSqList;
2.初始化动态数组
void InitList ( DSqList & L) {
L. data = ( int * ) malloc ( InitSize * sizeof ( int ) ) ;
L. length = 0 ;
L. MaxSize = InitSize;
}
3.增加动态数组长度
void IncreaseSize ( DSqList & L, int len) {
int * p = L. data;
L. data = ( int * ) malloc ( ( L. MaxSize + len) * sizeof ( int ) ) ;
for ( int i = 0 ; i < L. length; ++ i) {
L. data[ i] = p[ i] ;
}
L. MaxSize + = len;
free ( p) ;
}
4.排序算法
bool InsertAndSort ( DSqList & L, int e) {
if ( L. length >= L. MaxSize)
{
printf ( "数组已满,插入失败,请增加长度后再插入!" ) ;
return false;
} else if ( L. length == 0 ) {
L. data[ 0 ] = e;
L. length++ ;
return true;
} else {
int i, j;
i = L. length;
if ( e < L. data[ i - 1 ] ) {
for ( j = i - 1 ; j >= 0 && L. data[ j] > e; -- j)
L. data[ j + 1 ] = L. data[ j] ;
L. data[ j + 1 ] = e;
L. length++ ;
} else {
L. data[ L. length] = e;
L. length++ ;
}
return true;
}
}
5.实时输入数值并排序
void CreateList ( DSqList & L) {
int e;
scanf ( "%d" , & e) ;
getchar ( ) ;
while ( e != - 1 ) {
InsertAndSort ( L, e) ;
printf ( "请继续输入下一个值(如果结束请输入-1):" ) ;
scanf ( "%d" , & e) ;
getchar ( ) ;
}
}
二、不带哨兵的数组直接插入排序
void InsertSort_N ( int arr[ ] , int len) {
int i, j, temp;
for ( i = 1 ; i < len; ++ i) {
if ( arr[ i] < arr[ i - 1 ] ) {
temp = arr[ i] ;
for ( j = i - 1 ; j >= 0 && arr[ j] > temp; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ j + 1 ] = temp;
}
}
}
三、带哨兵的数组直接插入排序
void InsertSort_Y ( int arr[ ] , int len) {
int i, j;
for ( i = 2 ; i < len; ++ i) {
if ( arr[ i] < arr[ i - 1 ] ) {
arr[ 0 ] = arr[ i] ;
for ( j = i - 1 ; arr[ j] > arr[ 0 ] ; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ j + 1 ] = arr[ 0 ] ;
}
}
}
项目完整代码
#include <stdio.h>
#include <stdlib.h>
#define InitSize 25
typedef struct {
int * data;
int MaxSize;
int length;
} DSqList;
void InitList ( DSqList & L) {
L. data = ( int * ) malloc ( InitSize * sizeof ( int ) ) ;
L. length = 0 ;
L. MaxSize = InitSize;
}
void IncreaseSize ( DSqList & L, int len) {
int * p = L. data;
L. data = ( int * ) malloc ( ( L. MaxSize + len) * sizeof ( int ) ) ;
for ( int i = 0 ; i < L. length; ++ i) {
L. data[ i] = p[ i] ;
}
L. MaxSize + = len;
free ( p) ;
}
bool InsertAndSort ( DSqList & L, int e) {
if ( L. length >= L. MaxSize)
{
printf ( "数组已满,插入失败,请增加长度后再插入!" ) ;
return false;
} else if ( L. length == 0 ) {
L. data[ 0 ] = e;
L. length++ ;
return true;
} else {
int i, j;
i = L. length;
if ( e < L. data[ i - 1 ] ) {
for ( j = i - 1 ; j >= 0 && L. data[ j] > e; -- j)
L. data[ j + 1 ] = L. data[ j] ;
L. data[ j + 1 ] = e;
L. length++ ;
} else {
L. data[ L. length] = e;
L. length++ ;
}
return true;
}
}
void CreateList ( DSqList & L) {
int e;
scanf ( "%d" , & e) ;
getchar ( ) ;
while ( e != - 1 ) {
InsertAndSort ( L, e) ;
printf ( "请继续输入下一个值(如果结束请输入-1):" ) ;
scanf ( "%d" , & e) ;
getchar ( ) ;
}
}
void InsertSort_N ( int arr[ ] , int len) {
int i, j, temp;
for ( i = 1 ; i < len; ++ i) {
if ( arr[ i] < arr[ i - 1 ] ) {
temp = arr[ i] ;
for ( j = i - 1 ; j >= 0 && arr[ j] > temp; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ j + 1 ] = temp;
}
}
}
void InsertSort_Y ( int arr[ ] , int len) {
int i, j;
for ( i = 2 ; i < len; ++ i) {
if ( arr[ i] < arr[ i - 1 ] ) {
arr[ 0 ] = arr[ i] ;
for ( j = i - 1 ; arr[ j] > arr[ 0 ] ; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ j + 1 ] = arr[ 0 ] ;
}
}
}
int main ( ) {
DSqList L;
InitList ( L) ;
printf ( "请继续输入第一个值(如果结束请输入-1):" ) ;
CreateList ( L) ;
printf ( "根据输入的值直接排序结果为:" ) ;
for ( int i = 0 ; i < L. length; ++ i) {
printf ( "%d " , L. data[ i] ) ;
}
printf ( "\n" ) ;
int arr_n[ ] = { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;
int len = sizeof ( arr_n) / sizeof ( int ) ;
InsertSort_N ( arr_n, len) ;
printf ( "不带哨兵的数组进行直接排序结果为:" ) ;
for ( int i = 0 ; i < len; ++ i) {
printf ( "%d " , arr_n[ i] ) ;
}
printf ( "\n" ) ;
int arr_y[ ] = { 0 , 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;
len = sizeof ( arr_y) / sizeof ( int ) ;
InsertSort_Y ( arr_y, len) ;
printf ( "带哨兵的数组进行直接排序结果为:" ) ;
for ( int i = 1 ; i < len; ++ i) {
printf ( "%d " , arr_y[ i] ) ;
}
return 0 ;
}
运行效果图
int arr_n[ ] = { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;
int arr_y[ ] = { 0 , 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;