已知一个数组 9、29、95、47、79、37、18、56、96、22 使用选择排序是数组有序
选择排序同样是一个运行时间为O(N²)的排序算法。
算法思想:(以从小到大为例)
9、29、95、47、79、37、18、56、96、22 数组元素
0、1、 2、 3、 4、 5、 6、 7、 8、 9 数组下标
选择排序是选择一个位置进行排序,将有序元素排放在数组最左边。
第一轮排序
选择数组的第一个位置上的元素开始与其他元素进行逐个比较,即index[0]与index[1]、index[2]、index[3]、index[4]、index[5]、index[6]、index[7]、index[8]、index[9]比较,
将最小的元素放在index[0]所在的位置上。(期间进项相互比较和复制)。
第二轮排序
选择数组的第二个位置上的元素开始与其他元素进行逐个比较,即index[1]与index[2]、index[3]、index[4]、index[5]、index[6]、index[7]、index[8]、index[9]比较,
将最小的一个元素放在index[1]所在的位置上。
第三轮排序
。。。。
直到整个数组有序。
以下是通过java实现
private int[] Array;
private int currentIndex;
private int maxIndex;
public SelectOrder(int size) {
this.Array = new int[size];
this.currentIndex = 0;
this.maxIndex = size-1;
}
public void insert(int value) {
if(this.maxIndex<this.currentIndex) {
System.out.println("数组已满");
}else {
this.Array[this.currentIndex++] = value;
}
}
/**
* 选择排序的思想是“选择一个位置”进行排序,将有序元素放在数组最左边
*/
public void order() {
for(int i=0;i<this.Array.length-1;i++) {//外层循环控制位置
for(int j=i+1;j<this.Array.length;j++) {//里层循环进行循环比较
onChange(i,j);
}
}
}
public void onChange(int out,int in) {
if(this.Array[out]>this.Array[in]) {
int temp = this.Array[in];
this.Array[in] = this.Array[out];
this.Array[out] = temp;
}
}
public void show() {
for (int i : Array) {
System.out.println(i);
}
}
最终排序结果为: 9、18、22、29、37、47、56、79、95、96