选择排序算法是一种不太稳定的算法,算法的时间复杂度与元素的其实存放位置有关。
选择排序算法的主要实现过程如下;将要排序的元素中的第一个元素作为哨兵元素,将后边的元素依次与这个哨兵元素比较如果比哨兵元素大则放在哨兵后边(这里是按照从小到大的排序方式选择的)然后依次与哨兵元素的前面元素进行比较,并放在合适的位置;如果比哨兵元素小则放在哨兵元素的前边,然后依次与哨兵元素后边的元素进行比较,放在合适的位置。实现过程如图所示:
具体实现代码如下:
import java.util.Random;
public class InsertSoftTest {
public static void main(String[] args) {
// int[] arr = new int[] { 5, 7, 18, 13, 11, 21, 34, 78 };
// int[] arr = new int[] { 60,33,74,64,85,82,34,5,13 };
Random random = new Random();
int[] arr = new int[]{random.nextInt(100), random.nextInt(100), random.nextInt(100)
, random.nextInt(100), random.nextInt(100),
random.nextInt(100), random.nextInt(100), random.nextInt(100)
, random.nextInt(100)};
int[] sortArr = new int[arr.length];
// 将无序数组的第一个元素放入有序数组的第一个元素作为哨兵元素
sortArr[0] = arr[0];
// 记录有序数组中元素的个数
int sortcount = 1;
// 用于记录第一个值的位置
int sentry = 0;
int location;
for (int i = 1; i < arr.length; i++) {
// 将每一个值与第一次放入的值比较
if (arr[i] < sortArr[sentry]) {
if (sentry==0){
sortArr=move(sortArr,sentry,sortcount);
sortArr[sentry] = arr[i];
sentry++;
sortcount++;
}else {
// 从哨兵元素开始向前查找
for (location = sentry - 1; location >= 0; location--) {
if (sortArr[location] < arr[i]) {
break;
}
}
sortArr = move(sortArr, location+1, sortcount);
sentry++;
sortArr[location+1] = arr[i];
sortcount++;
}
} else {
//
for (location = sentry; location < sortcount; location++) {
if (sortArr[location] >= arr[i]) {
break;
}
}
sortArr = move(sortArr, location, sortcount);
sortArr[location] = arr[i];
sortcount++;
}
}
for (int a = 0; a < sortcount; a++) {
System.out.print(sortArr[a] + " ");
}
System.out.println();
}
// 将数组中的元素位置逐位向后移动
private static int[] move(int[] arr, int index, int sortcount) {
for (int i = sortcount - 1; i >= index; i--) {
// 将数组倒数第二位开始逐位向后移动
arr[i + 1] = arr[i];
}
arr[index] = 0;
return arr;
}
}
输出排序后的序列如图所示:
算法总体思想应该没有太大差距,但是实现方法可能不太简练,希望有大佬能指点一下