插入排序适用于小规模排序,其原理:
设下标0,即Array[0]为已排好序的子列,从数组下标1,即第二个元素Array[1]开始,依次与子列相比较,直到当前的排序元素小于子列的元素不成立(小于则交换位置),就结束当前排序,进入下一次排序,直到子列长度等于数组长。伪代码:
for (int i =1; i < Length; ++i)
temp = Array[i];
for (int j = i - 1; j >= 0;--j)
if (Array[j]>temp)
Array[j + 1] = Array[j];
Array[j] = temp;
具体实现:
//插入排序.cpp:定义控制台应用程序的入口点。
//作者Hecker.ShengTao.Tan
#include"stdafx.h"
#include<stdlib.h>
#include<iostream>
#include<time.h>
#include<windows.h>
#define MAX 10
void Output(int Array[], int Length){
printf("\n");
for (int i = 0; i < Length; ++i){
printf("%d ", Array[i]);
}
printf("\n\n");
}
void Output1(int Array[], int Length, int value){
printf("\n");
for (int i = 0; i < Length; ++i){
if (Array[i] == value){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN);
printf("%d ", Array[i]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
}
else{
printf("%d ", Array[i]);
}
}
printf("\n\n");
}
void Ran_Array(int Array[], int Length){
srand((unsigned)time(NULL));
for (int i = 0; i < Length; ++i){
Array[i] = rand() % 100;
if (i>0 && Array[i] == Array[i - 1]){
Array[i] = rand() % 100;
}
}
}
int Insert_Sort(int Array[], int Length){
int temp = NULL;
for (int i = 1; i < Length; ++i){
temp = Array[i];
printf("\n\n第%d次排序:\n", i);
printf("此时:Array[i]=%d\n", Array[i]);
for (int j = i - 1; j >= 0; --j){
if (Array[j]>temp){
printf("此时:Array[j]=%d\n", Array[j]);
Array[j + 1] = Array[j];
Array[j] = temp;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);
Output1(Array, Length, temp);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
}
}
}
return 1;
}
int main(){
int Array[MAX];
int Length = MAX;
Ran_Array(Array, Length);
printf("排序前:\n");
Output(Array, Length);
Insert_Sort(Array, Length);
printf("排序完成\n");
printf("排序后:\n");
Output(Array, Length);
system("pause");
return 1;
}