小菜乃机械狗一枚,不知何原因接触代码好多年,于是乎决心找个程序猿工作。昨天面试华硕科技,主管让我排序一个数组,再三询问可不可以写冒泡后,还是写了个冒泡程序,结果没完,让我改进冒泡算法,已优化比较次数,这才发现自己的功力真低·····
废话不多说,先来个冒泡的原始版本:
void bobble_sort1(int *array,int length) { for (int i=0;i<length;++i) { for (int j = length-1;j>i;--j) { if (array[j-1]>array[j]) //每次将最小值“冒”在前面 { exchange(&array[j],&array[j-1]); } } } }
改进一:
在原始版本中,如果某次内层循环没有进行交换,则说明数组已经排好序,无需再扫描。于是可以设置一个标志来记录是否某次内循环没有交换,若标志为false,则退出外层循环,排序结束:
void bobble_sort1EX(int *array,int length) { bool flag = true; for (int i=0;i<length && flag;++i) { flag = false; for (int j=length-1;j>i;--j) { if (array[j-1]>array[j]) { exchange(&array[j-1],&array[j]); flag = true; } } } }
改进二:
在第一步优化的基础上发进一步思考:如果R[0..i]已是有序区间,上次的扫描区间是R[i...n-1],记上次扫描时最后 一次执行交换的位置为lastSwapPos,则lastSwapPos在i与n之间,不难发现R[i..lastSwapPos]区间也是有序的,否则这个区间也会发生交换;所以下次扫描区间就可以由R[i..n-1] 缩减到[lastSwapPos..n-1]:
void bubble_sort2EX(int array[],int length) { int lastSwapPos; int lastSwapPos_temp = 0; for (int i=0;i<length;++i) { lastSwapPos = lastSwapPos_temp; for (int j = length-1;j>lastSwapPos;--j) { if (array[j-1]>array[j]) { exchange(&array[j],&array[j-1]); lastSwapPos_temp = j-1; //记录最后一次交换的位置 } } } }
浙公网安备 33010602011771号