数据结构与算法-简单选择排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FTD_SL/article/details/84936838

选择排序法初步思想

爱炒股票断线的人,总是喜欢不断的买进卖出,想通过价差来实现盈利。但通常这种频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少。还有一种做股票的人,他们很少出手,只是在不断的观察和判断,等到时机一到,果断买进或卖出。他们因为冷静和沉着,以及交易的次数少,而最终收益颇丰。

冒泡排序的思想就是不断地在交换,通过交换完成最终的排序,这和做股票短线频繁操作的人是类似的。我们可不可以像只有在时机非常明确时才出手的股票高手一样,也在排序时找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作呢?这就是选择排序法的初步思想。

基本概念

简单选择排序法(Simple Selection Sort)就是通过n-i-1次关键字间的比较,从n-i个记录中选出关键字最小的记录,并和第i(0≤i≤n)个记录交换之。

java代码实现

/* 申明待排序数组 */
int[] a = {9,1,5,8,3,7,4,6,2};
int min = 0;
for (int i = 0; i < a.length; i++) {
    min = i;	/* 将当前下标定义为最小值下标 */
    for (int j = i+1; j < a.length; j++) { /* 循环【之后】的数据 */
	 if (a[j] < a[min]) { /* 如果有小于当前最小值的关键字 */
	     min = j;	/* 将此关键字的下标赋值给min */
	 }
    }
    if (i != min) { /* 若min不等于i,说明找到最小值,交换两者 */
	int temp = a[i];
	a[i] = a[min];
	a[min] = temp;
    }
}

图示执行过程

时间复杂度分析

  • 从简单选择排序的过程来看,它最大的特点就是交换移动的次数相当少,这样也就节约了时间。分析他的时间复杂度发现,无论最好最差的情况,其比较次数都是一样多,第i趟排序需要进行n-i-1次关键字的比较,此时需要比较(n-1)+(n-2)+···+1=n(n-1)/2次。而对于交换次数而言,当最好的时候(表本身有序),交换0次,最差的时候,也就是初始降序时,交换次数为n-1次,基于最终的排序时间是比较与交换的次数总和,因此,总的时间复杂度依然为O(n2)。
  • 尽管与冒泡排序同为O(2),但简单选择排序的性能还是要略优于冒泡排序

猜你喜欢

转载自blog.csdn.net/FTD_SL/article/details/84936838
今日推荐