2-路插入排序
2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间。并记录辅助空间内最大元素和最小元素的位置。将待插入的元素与最大元素和最小元素继续比较,从而决定然后排序;
# include <stdio.h>
void TwoInsertSort(int *Array, int Length){
int TempArray[Length]={0};//辅助数组,用来暂存数组元素 此数组为循环数组
int start = 0, end = 0;//记录辅助数组中最小元素和最大元素的位置
int j, i;
TempArray[0] = Array[0];//向辅助数组预先插入一个元素
for(i = 1; i < Length; i++){//从数组Array[1]开始排序
if(Array[i]>TempArray[end]){//如果数组Array[i]>比辅助数组中最大的元素大
end++;
TempArray[end] = Array[i];
}
else if(Array[i] < TempArray[start]){//如果数组Array[i]>比辅助数组中最小的元素小
start = (start+Length-1)%Length;
TempArray[start] = Array[i];
}else{//大于最小值,小于最大值
j = end++;
while(TempArray[j]>Array[i]){
TempArray[(j+1)%Length] = TempArray[j];
j = (j+Length-1)%Length;
}
TempArray[j+1] = Array[i];
}
//每次排序后的结果
printf("第%d次排序:\n", i);
for(int j = 0; j<Length; j++){
printf("%d ", TempArray[j]);
}
printf("\n");
}
printf("排序后最终结果:\n");
for(int i = 0; i < Length; i++){
Array[i] = TempArray[start];
start = (start+1)%Length;
}
for(int i = 0; i<Length; i++){
printf("%d ", Array[i]);
}
return ;
}
int main(void){
int a[] = {49, 38, 65, 97, 76, 13, 27, 49};
int n = 8;
TwoInsertSort(a, n);
return 0;
}