JAVA简单选择排序算法及实现

更新时间:2019-02-22 来源:热点资讯 点击:

【www.0477edu.com--热点资讯】

  简单选择排序:

  (选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1)

  复杂度: 所需进行记录移动的操作次数较少 0--3(n-1) ,无论记录的初始排列如何,所需的关键字间的比较次数相同,均为n(n-1)/2,总的时间复杂度为O(n2);

  空间复杂度 O(1)

  算法改进:每次对比,都是为了将最小的值放到第一位,所以可以一比到底,找出最小值,直接放到第一位,省去无意义的调换移动操作。也可以换一个方向,最后一位与前面每一个比较,每次使最大值沉底,最后一位向前推进。

  复制代码 代码如下:

  public static void selectSort(Date[] days) {

  int min;

  Date temp;

  for (int i = 0; i < days.length; i++) {

  min = i;

  for (int j = min + 1; j < days.length; j++) {

  if (days[min].compare(days[j]) > 0) {

  min = j;

  }

  }

  if (min != i) {

  temp = days[i];

  days[i] = days[min];

  days[min] = temp;

  }

  }

  }

  class Date {

  int year, month, day;

  Date(int y, int m, int d) {

  year = y;

  month = m;

  day = d;

  }

  public int compare(Date date) {

  return year > date.year ? 1 : year < date.year ? -1

  : month > date.month ? 1 : month < date.month ? -1

  : day > date.day ? 1 : day < date.day ? -1 : 0;

  }

  public void print() {

  System.out.println(year + " " + month + " " + day);

  }

  }

  简单选择排序(Simple Selection Sort):

  简单选择排序类似于冒泡排序(Bubble Sort) ,每次都会在剩下的元素集合中选择出一个最值出来填充到当前位置。唯一的区别是,冒泡排序在每次发现比当前值小于(或大于)时,都会交换元素的位置, 而 简单选择排序是选择剩余元素中的最值和当前位置交换数据。

  比如对于元素集合R={37, 40, 38, 42, 461, 5, 7, 9, 12}

  在第一趟排序中:37直接和5交换, 形成新的序列 R1={5,40,38,42,461,37,7,9,12}

  在第二趟排序中:40直接和7交换, 形成新的序列 R2={5,7,38,42,461,37,40,9,12}

  以此类推,直到最后一个元素(注意:在第二趟排序中,38比42小,但是他们并没有交换数据)。

  以下是简单选择排序的一个Java实现版本:

  复制代码 代码如下:

  public static void selectionSort(int[] data) {

  if (data == null || data.length <= 1)

  return;

  int i, j, value, minPos, len = data.length;

  int outer = len - 1, tmp;

  for (i = 0; i < outer; i++) {

  value = data[i];

  minPos = -1;

  for (j = i + 1; j < len; j++) {

  if (data[j] < value) {

  minPos = j;

  value = data[j];

  }

  }

  if (minPos != -1) {

  tmp = data[i];

  data[i] = value;

  data[minPos] = tmp;

  }

  // for (int k = 0; k < len; k++) {

  // System.out.print(data[k] + " , ");

  // }

  // System.out.println();

  }

  }

  public static void main(String[] args) {

  int[] coll = {

  37, 40, 38, 42, 461, 5, 7, 9, 12

  };

  selectionSort(coll);

  for (int i = 0; i < coll.length; i++) {

  System.out.print(coll[i] + " , ");

  }

  }

  树选择排序(Tree Selection Sort)

  树选择排序算法相对于简单选择排序来说是典型的以空间换时间的算法。其思想是对待排序的 N 个元素 , 构造出相对较小的 (n+1)/2个数,然后再构造出相对较小的[n+1]/4个数,直到只有一个元素为止。构造成一个完全二叉树。

  排序的时候,那个元素就是最小的,取出该最小元素,将该元素替换为"最大值",再调整完全二叉树。

  下面是树形选择排序的一个Java实现版:

  复制代码 代码如下:

  public static void treeSelectionSort(int[] data) {

  if (data == null || data.length <= 1)

  return;

  int len = data.length , low = 0 , i , j;

  // add Auxiliary Space

  int[] tmp = new int[2*len -1];

  int tSize = tmp.length;

  //construct a tree

  for(i =len-1 , j=tmp.length-1;i >=0 ;i--,j--){

  tmp[j]=data[i];

  }

  for(i = tSize -1 ; i > 0 ; i-=2){

  tmp[(i-1)/2] = tmp[i] > tmp[i-1]? tmp[i-1]:tmp[i];

  }

  //end

  //remove the minimum node.

  while(low < len){

  data[low++] = tmp[0];

  for(j=tSize-1;tmp[j]!=tmp[0];j--);

  tmp[j] = Integer.MAX_VALUE;

  while(j > 0){

  if(j%2 == 0){ //如果是右节点

  tmp[(j-1)/2] = tmp[j] > tmp[j-1]?tmp[j-1]:tmp[j];

  j = (j-1)/2;

  }else{ //如果是左节点

  tmp[j/2]=tmp[j] > tmp[j+1]? tmp[j+1]:tmp[j];

  j = j/2;

  }

  }

  }

  }

  在构造完全二叉树的时候对 N 个元素的集合, 需要 2*N -1 个辅助空间。

  复制代码 代码如下:

  while(j > 0){

  if(j%2 == 0){ //如果是右节点

  tmp[(j-1)/2] = tmp[j] > tmp[j-1]?tmp[j-1]:tmp[j];

  j = (j-1)/2;

  }else{ //如果是左节点

  tmp[j/2]=tmp[j] > tmp[j+1]? tmp[j+1]:tmp[j];

  j = j/2;

  }

  }

  则实现递归的构造新集合中的最小值。

本文来源:http://www.0477edu.com/thread-44964-1-1.html

推荐内容

为您推荐

[智学网登陆首页]2017年智学网登陆及使用流程

导语:关于智学网大家都知道是什么吗?作为一名教师都知道要怎么用了吗?如果还不清楚,我们就一起来看看下面的使用流程吧。智学网教师端网页登录平台是一款智学网登陆查分首页(家长登录网站),智阅卷查成绩,用户可以在这里给学生布置作业,对作业和试卷进行批改,还可以一键快速查看优秀的成绩,让学生们第一时间了解自

2019-04-08 01:37:00   智学网登录查成绩2017  

感冒英语怎么说啊_关于感冒的英语短语

引言:学英语的过程中我们会接触到各种关于疾病的词汇,下面小编来跟大家分享一下若是患上感冒,我们该如何表达症状及治疗方法。近几天,小编重感冒(catch a bad cold),感觉非常难受。第一天,感觉嗓子疼(have a sore throat),出现感冒症状(symptom)。第二天,感冒症状全

2019-02-05 04:06:50   感冒说说短语  

交通规则用英语怎么说|关于交通规则的100个英语短语

无规矩不成方圆,无论我们是身处在国内还是国外都应该遵守交通规则。所以下面我们就来看看关于交通规则的短语吧!1 交通规则 traffic regulation2 路标 guide post3 里程碑 milestone4 停车标志 mark car stop5 红绿灯 traffic lig

2019-02-04 20:17:27   100个英语短语造句  

[考研英语单词app]考研英语单词复习该用什么书

引言:同学们正努力为考研备战之余小编特地来给大家一点福利,推荐几本可用于考研英语单词复习的优秀参考书,希望各位小伙伴喜欢。(1)新东方乱序版本书完整收录大纲词汇,按难度区分核心单词和简单单词,补充超纲单词。精选单词释义,标注常考释义,核心单词“乱序”编排并提供考频。采用&ld

2019-02-03 22:01:00  

【一至十二月的英语单词怎么写】一月到十二月的英语单词怎么写

引言:下面是小编为大家整理的一月到十二月的英语单词的拼写,括号内为缩写。 1月 January (Jan )2月 February (Feb )3 月 March (Mar )4月 April (Apr )5月 May (May )6月 June (Jun )7月 July (Jul )8月 Au

2019-02-03 22:01:00   一至十二月的英语单词