选择排序

来源:互联网 发布:影音先锋替代软件 编辑:程序博客网 时间:2024/06/05 19:11

直接选择排序的基本思想是:第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 6770 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)。

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