排序算法(4)--Selection Sorting--选择排序[1]--Simple Selection Sort--简单(直接)选择排序
1.基本思想
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
2.实现原理
每趟从待排序的记录序列中选择关键字最小的记录放置到已排序表的最前位置,直到全部排完。关键是在剩余的待排序记录序列中找到最小关键码记录。
3.代码实例
(1)代码:
/** * 简单选择排序 * 原理:从i到arr.length-1,每次迭代将i到arr.length-1中最小(最大)的那个数交换到i的位置,然后i++,再循环 * @param arr 待排序的数组 */ public static void simpleSelectSort(int[] arr){ //minLoc用于记录i+1到arr.length-1这个区间的最小值的下标(i会递增),i表示要交换的位置。 for (int i=0,j=0,minLoc=0; i<arr.length; i++) { minLoc = i; for (j=i+1; j < arr.length; j++) {//找出i+1到args.length-1这个区间的最小值的下标 if(arr[j] < arr[minLoc]){ //记录最小值下标 minLoc = j; } } if(minLoc!=i){//如果minLoc!=i,说明minLoc有变化,就进行交换 int temp = arr[i]; arr[i] = arr[minLoc]; arr[minLoc] = temp; } } } public static void main(String[] args) { int[] array = {12,53,48,26,43,62,46,48}; System.out.print("before sort:"); for (int i = 0; i < array.length; i++) { System.out.print(array[i]+" "); } System.out.println(); simpleSelectSort(array); System.out.print("after sort:"); for (int i = 0; i < array.length; i++) { System.out.print(array[i]+" "); } }
(2)结果:
before sort:12 53 48 26 43 62 46 48
after sort:12 26 43 46 48 48 53 62
4.算法分析
(1)从待排序序列中,找到关键字最小的元素;
(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。
5.排序特点
简单选择排序是不稳定的排序。
(1)时间复杂度: 整个排序需比较n-1次,分别为n-1,n-2...1。故
时间复杂度:O=(n-1)+(n-2)+...+1=O(n2)。
(2)空间复杂度: 一个辅助空间,故
空间复杂度为:O(1)。