选择排序

直接选择排序的基本思想是:第1趟中,从n个记录中选择出古按键自最小的的记录与第一个记录交换位置;第2趟中,从第二个记录开始的n-1个记录中找出关键字最小的记录与第二个记录交换;以此类推,在第i趟中找出从第i个记录开始的n-i+1个记录中选出关键字值最小的记录与第i个记录交换,直到整个记录排好序为止。


假设有待排序的8个记录的关键字序列为{52,39,67,95,70,8,95,25}:

  初始数据: 52 39 67 95 70 8 95 25

第一趟       8 39 67 95 70 52 95 25  

第二趟       8 25 67 95 70 52 95 39

第三趟       8 25 39 95 70 52 95 67

第四趟          8 25 39 52 70 95 95 67

第五趟          8 25 39 52 67 95 95 70

第六趟          8 25 39 52 67 70 95 95


直接选择排序算法步骤:

(1)置i的初始值为0;

(2)当i<n-1时,重复下面步骤:

        (1)在无序子序列中{r[i+1],r[i+2]......r[n-1]}中选出关键字值最小的记录r[min];

(2)如果r[min] != r[i],则交换r[min]与r[i]的位置,否则不进行任何交换;

(3)将i的值加1;


直接选择算法代码如下:

public void select(int[] arr){
		if(arr == null || arr.length == 0 )
			return ;
		for(int i=0;i<arr.length;i++){
			int min = i;
			for(int j=i+1;j<arr.length;j++){
				if(arr[min] > arr[j]){
					min = j;
				}
			}
			if(min != i){   //如果最小关键字下标不等于i,则交换
				int temp = arr[i];
				arr[i] = arr[min];
				arr[min] = temp;
			}
		}
		
	}


算法性能分析:

(1)空间复杂度:直接选择排序仅用了一个辅助单元,空间复杂度为O(1)。

(2)时间复杂度:从算法中可以看出整个排序过程中关键字的比较次数与初始关键字的状态无关。每执行一次循环都必须进行一次关键字的比较,其外循环共需执行n-1次,内循环共需执行n-i-1次,因此,总的比较次数1/2*n(n-1)。直接选择排序算法移动记录次数较少,最好情况是当待排序记录序列有序时,移动记录次数为0,最坏情况是当待排序序列逆序时,移动次数为3*(n-1),因此直接排序算法的时间复杂度为O(n^2)。

直接选择排序算法是一种不稳定算法,拍好排序后不能保证关键字的相对位置保持不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值