选择排序:随便站一排,第一个先站出来,和后面最小的那个比较,如果和后面最小的还小,那么排头就是他的,如果比最小的小,那么他和那个最小的换一下位置,但是不管怎么排,最小的位置是有人占了,剩下的都比他要大,剩下的也按照这个规矩排吧,可是不用和第一个了比了,只后面的进行比较就行了,这样一圈下来,每次都选出来了最小的,最小的按照顺序排列了,那么队列自然站好了。
具体代码如下:
public static int[] sortSelect(int[] arr) { for (int i = 0; i < arr.length; i++) { int index = i; for (int m = i + 1; m < arr.length; m++) { if (arr[m] < arr[index]) { index = m; } } if (arr[i] > arr[index]) { int temp; temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; } } return arr; }
我稍微改进了一下,改进的地方标红了,
public int[] sortSelect(int[] array) { int length = array.length; for (int i = 0; i < length; i++) { //取出来i 坐标后面所有元素中最小的那个数的坐标 int index = length-1;//默认是最右边为基准进行比较 for (int j = i + i; j < length-1; j++) { if (array[j] < array[index]) {//如果小于最右边的值,那么基准改变 index = j; } } //到这为止,得到了最小值的坐标index if (array[i] > array[index]) { //比大小,如果比最小的要大,两个就交换一下位置 swap(array, i, index); } } return array; } private void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; }
这是我稍微改进了一下,改进的地方标红了,
说明为什么:第一个地方是先把数组长度记录下来,然后在进行循环,如果循环中每次都记录长度,肯定会影响效率的,这个都应该知道,
主要是下面的,我之所以没有index 的位置改一下,我是想着 如果index 刚开始等于i的情况,那么内循环结束后,得到的是整个队列中最小的值,这样只需要把这个值赋值给i的位置就可以了,没有必要进行判断了,而如果index 从最后一个开始,循环结束到最后一个前面那个,内循环得到的就是后面中最小的,然后再和i 位置的进行比较,得到的也是整个队列中最小的,再判断是否要进行交换,这样会更合理的。肯定会有其他修改方法,这只是一种。