之前学到的选择排序(博客前篇)是第一个无序元素与其他元素依次比较,其中每次比较存在前面元素大于后面元素就交换。这样在堆内存中交换的次数就比较频繁,但其实一轮过后是找到最小元素与无序区第一个元素交换。
new:我们大可在内存建立两个变量来存储每次比较的较小值和较小值的下标,每次比较就刷新。
public static void selectSort(int[] arr) //未优化的选择排序 { for(int x = 0;x<arr.length-1;x++) //从第一个元素开始,共进行arr.length-1轮,就是外层循环。 { for(int y = x+1;y<arr.length;y++) //内层循环比较是第一个无序元素从比较第二个无序元素开始 { if(arr[x]>arr[y]) //如果第一个无序元素比所比元素大时,交换元素。 { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } } } }
----------------------------------------------------------------------------------------------------------------------------------
public static void selectSort2(int[] arr) //优化后的选择排序 { for(int x = 0;x<arr.length-1;x++) //与之前一样,外层循环确定轮数,共有arr.length-1 轮 { int num = arr[x]; //将每轮开始的元素值赋给栈内存的num int index = x; //将每轮开始元素的下标赋给栈内存的index for(int y = x+1;y<arr.length;y++) //与之前一样,内层循环确定比较次数 { if(num>arr[y]) //如果比较过程中,num的值比所比较的值大,则用较小值刷新num的值,并将下标赋给index { num = arr[y]; index = y; } } if(index!=x) //减少判断 如果每轮的第一个元素就是此轮比较的最小值 那么他不用和自己交换 //如果不同,则交换 { int temp = arr[index]; arr[index] = arr[x]; arr[x] = temp; } } }