选择排序:随便站一排,第一个先站出来,和后面最小的那个比较,如果和后面最小的还小,那么排头就是他的,如果比最小的小,那么他和那个最小的换一下位置,但是不管怎么排,最小的位置是有人占了,剩下的都比他要大,剩下的也按照这个规矩排吧,可是不用和第一个了比了,只后面的进行比较就行了,这样一圈下来,每次都选出来了最小的,最小的按照顺序排列了,那么队列自然站好了。
具体代码如下:
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 位置的进行比较,得到的也是整个队列中最小的,再判断是否要进行交换,这样会更合理的。肯定会有其他修改方法,这只是一种。