方式一:传整数参数判断升降排序
void insertion_sort(int *sort_arr, int start, int end, char sort_choice){
int i = 0, j = 0, temp = 0, k = 0;
if(1 == sort_choice){//大数在前
for(j = 1; j<= end; j++){
temp = sort_arr[j];
for(i = j - 1; i >= 0; i--){
if(sort_arr[i] < temp){
sort_arr[i + 1] = sort_arr[i];
}else{
break; //j左边的始终是排序好的
}
}
sort_arr[i + 1] = temp; //i 总是在中断处的前面一位
// for(k = 0; k < 10; k++){
// printf("%d\t",sort_arr[k]);
// }
// printf("\n\r",sort_arr[k]);
}
}else if(0 == sort_choice)//小数在前
{
for(j = 1; j<= end; j++){
temp = sort_arr[j];
for(i = j - 1; i >= 0; i--){
if(sort_arr[i] > temp){
sort_arr[i + 1] = sort_arr[i];
}else{
break;
}
}
sort_arr[i + 1] = temp; //i 总是在中断处的前面一位
// for(k = 0; k < 10; k++){
// printf("%d\t",sort_arr[k]);
// }
// printf("\n\r",sort_arr[k]);
}
}
}
注:升降判断不放在循环内,减少判断次数
方式二:函数参数使用回调函数
插入排序主体
void insertion_sort(int *sort_arr, int start, int end, char(*sort_select)(int, int))
{
int i = 0, j = 0, temp = 0, k = 0;
for(j = 1; j<= end; j++){
temp = sort_arr[j];
for(i = j - 1; i >= 0; i--){
if(sort_select(sort_arr[i], temp)){
sort_arr[i + 1] = sort_arr[i];
}else{
break;
}
}
sort_arr[i + 1] = temp; //i 总是在中断处的前面一位
// for(k = 0; k < 10; k++){
// printf("%d\t",sort_arr[k]);
// }
// printf("\n\r",sort_arr[k]);
}
}
插入排序判断体,分为两部分,一个升序一个降序
char insertion_sort_Increase(int a, int b){
return a>b ? 1:0;
}
char insertion_sort_Deincrease(int a, int b){
return a>b ? 0:1;
}
调用方法:
insertion_sort_2(/*排序数组*/,/*起始位*/,/*结束位*/,\
insertion_sort_2_Deincrease(或者insertion_sort_2_Increase)); //降序