Java排序(二):选择排序

版权声明:转载请注明原文地址。 https://blog.csdn.net/qq_39240270/article/details/86931690

选择排序的实现思想

       在未排序序列中找到最小元素,放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾,循环直到所有元素军排序完毕。

  1. 初始状态:无序区为S[1,2,…,n],有序区为空;
  2. 第i趟排序(i = 1,2,3,…,n-1)开始时,当前有序区和无序区分别为S[1…i-1]和S[i…n]。该趟排序从当前无序区中选出最小的记录S[s],将它与无序区的第1个记录S[i]交换,使S[1…i]和S[i+1…n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  3. 循环n-1次,排序完成。

Java实现选择排序

public class SelectionSort {
	public static void selectionSort(int[] a){
		int minIndex,temp;
		for(int i = 0;i < a.length-1;i ++){//外层循环,代表着无序区,从第一个元素开始,直到倒数第二个元素结束,时间复杂度为O(N)
			minIndex = i;//假设无序区第一个元素为最小元素
			for(int j = i+1;j < a.length-i;j++){//内层循环,用于找出无序区最小元素,从无序区第二个元素开始比较,到无序区最后一个元素,时间复杂度为O(N)
				if(a[minIndex] > a[j]){
					minIndex = j;//当无序区中有元素小于假设的最小元素时,交换索引
				}
			}
			//找到了无序区最小的元素,将该最小元素与无序区第一个元素进行交换,然后进行下一轮比较
			temp = a[i];
			a[i] = a[minIndex];
			a[minIndex] = temp;
		}
	}
	
	//测试
	public static void main(String[] args) {
		int[] a = {5,10,64,3,4,1,6};
		System.out.println("排序前:" );
		for (int i : a) {
			System.out.print(" " + i);
		}
		SelectionSort.selectionSort(a);
		System.out.println();
		System.out.println("排序后:" );
		for (int i : a) {
			System.out.print(" " + i);
		}
	}
}

测试结果:
在这里插入图片描述

选择排序的总结

       选择排序为两层for循环嵌套,时间复杂度为O(N2),内层循环始终去找最小值,放到最前面。交换次数比冒泡排序少很多,所以实际执行效率比冒泡排序快。衍生算法,双向选择排序(每次循环,同时选出最大值放在末尾,最小值放在前方),可以提高选择效率。
       选择排序最好和最坏的情况一样运行了O(N2),但是选择排序无疑比冒泡排序更快,因为它进行的交换少得多,当N值较小时,特别是如果交换时间比比较时间大的多时,选择排序实际上是相当快的。平均时间复杂度也是O(N2)。
      算法是不稳定的,假设a=b,且a在b前面,而某次循环中最小值在b后面,而此最小值需要跟a交换位置,这时候b就在a前面了,所以选择排序时不稳定的。
      看见复杂度为O(1),不需要额外的空间。

猜你喜欢

转载自blog.csdn.net/qq_39240270/article/details/86931690