简单的选择排名((选择最小值置于第一位,然后第一位向后推移的循环)第一位与后面逐一比较,每次最小的顶部,第一位向后推移) ),也就是说,刚选择的第一位为最小值,不再参加比较
复杂度:需要移动记录的操作次数少于0--3(n-1 ),无论记录的初始排列如何,所需的关键字之间的比较次数相同,为n(n-1 )/2,总时间复杂度为o ) n2 );
空间复杂性o(1) )。
算法的改进:每次比较时,为了将最小值作为第一位,与最后进行比较,找出最小值,直接作为第一位,可以省去无意义的移动操作。 也可以改变方向。 最后一位与前一位相比,每次都将最大值下沉到底部,最后一位向前移动。
JAVA源代码:
复制代码的话就是:
publicstaticvoidselectsort (date [ ] days ) {
int min;
Date temp;
for(intI=0; i days.length; I ) {
min=i;
for(intj=min1; j days.length; j ) {
if(days[min].compare(days[j] )0) {
min=j;
}
}
if (最小!=i ) {
temp=days[i];
days[i]=days[min];
days[min]=temp;
}
}
}
类日期{
int year,month,day;
date(inty,int m,int d ) {
year=y;
month=m;
day=d;
}
公共输入公司(datedate ) {
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;
}
公共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实现的版本。
复制代码的话就是:
publicstaticvoidselectionsort (int [ ] data ) {
if(data==null||data.length=1) () ) ) ) ) ) ) )。
返回;
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=I1; j len; j ) {
if(data[j]value ) {
minPos=j;
value=data[j];
}
}
if (最小销售点!=-1({
tmp=data[i];
data[i]=value;
data[minPos]=tmp;
}
//for(intk=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;
}
}
则实现递归的构造新集合中的最小值。
冒泡排序算法和简单选择排序算法的js实现
之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...
Python实现的选择排序算法原理与用法实例分析
Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...
C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置
#include int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...
简单选择排序算法的C++实现
简单选择排序采用最简单的选择方法,即在剩余序列中选出最小(或最大)的关键字,和剩余序列的第一个关键字交换位置,依次选择下去,直至使整个序列有序. 算法中两层循环的执行次数和初始序列没有关系,第二层循环 ...
简单选择排序算法(C++版)
#include using namespace std; /** Simple Select Sort * brief: * Key: * * position: ...
排序系列 之 简单选择排序及其改进算法 —— Java实现
简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 ...
内部排序->;选择排序->;简单选择排序
文字描述 简单排序的基本思想是:每一趟在n-i+1(i=1,2,…,n)个记录中选取关键字最小的记录作为有序列表中的第i个记录. 示意图 略 算法分析 简单排序算法中,所需进行记录移动的操作次数较少, ...
常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现
今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...
Java排序算法(二):简单选择排序
[基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用 ...
随机推荐
XSS原理
跨站脚本攻击(Cross-Site Scripting),是一种网站应用程序的安全漏洞,是代码注入攻击的一种. XSS的种类: 反射型XSS: 非持久型XSS(需要自行触发,输入-输出). ...
TAP/TUN摘要
TUN适用于IP帧.Tap适用于以太网帧.TAP摸拟一个以太网设备(以arp广播MAC识别),它操作第二层数据包如以太网数据帧.TUN模拟了网络层ip设备(以点对点的方式,使用ip标识),操作第三层数 ...
Remove Duplicates from Sorted Array [LeetCode]
Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...
Studio之版本管理工具Git (图文教程)
目前业界主流的版本管理工具主要是 svn/git.svn是1种集中式的代码管理工具,而git是1种散布式的代码管理工具,广受极客的爱好.而基于git的github更是全宇宙码农的提高逼格,深究技术的必 ...
ios项目记录
1,如何隐藏状态栏 在基类中重载UIViewController.h中的这个方法 - (BOOL)prefersStatusBarHidden { // iOS7后,[[UIApplication s ...
ASP.NET MVC路由配置
一.命名参数规范+匿名对象 routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}" ...
利用Dnspod api批量更新添加DNS解析【python脚本】 - 推酷
利用Dnspod api批量更新添加DNS解析[python脚本] - 推酷 undefined
python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介
内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...
Selenium自动化测试(java语言)
Selenium介绍 Selenium 1.0 包含 core. IDE. RC. grid 四部分, selenium 2.0 则是在两位gydy偶遇相互沟通决定把面向对象结构化( OOPP) 和便于 ...