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};
