via: http://flycars001.iteye.com/blog/2007081
选择排序(Selection Sort )分为两种 简单选择排序(Simple Selection Sort) 和树形选择排序。
简单选择排序(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;
}
}
-----------------------------------------------------------
Java 常用4种排序方法
class zyfsort {
public static void main (String[] args) {
int gohome[] = new int[]{12,7,54,21,1,4,65,76,34,9,3,6};
System.out.println("插入排序算法");
// InsertionSort(gohome);
// SelectSort(gohome);
// BubbleSort(gohome);
gohome =QuickSort(gohome);
for (int t=0; t<gohome.length;t++)
{
System.out.print(gohome[t]+"--");
}
}
//插入排序算法
public static void InsertionSort(int[] goal)
{
for (int i = 1; i<goal.length; i++)
{ int now = i;
int frank = goal[i];
while (now>0 && goal[now-1] <= frank)
{
goal[now]=goal[now-1];
now--;
}
goal[now]=frank;
}
for (int t=0; t<goal.length;t++)
{
System.out.print(goal[t]+"--");
}
}
//选择排序算法
public static void SelectSort(int[] goal)
{
int max;
int stmp;
for (int i = 0; i<goal.length-1; i++)
{
max=i;
for (int j = i+1; j<goal.length; j++)
if(goal[j]>goal[max])
max=j;
stmp = goal[i];
goal[i]=goal[max];
goal[max]=stmp;
}
for (int t=0; t<goal.length;t++)
{
System.out.print(goal[t]+"--");
}
}
//冒泡排序算法
public static void BubbleSort(int[] goal)
{ int stmp;
for (int i = 1; i< goal.length; i++)
{
for(int j=0; j<i;j++)
{
if(goal[i]>goal[j])
{
stmp=goal[i];
goal[i]=goal[j];
goal[j]=stmp;
}
}
}
for (int t=0; t<goal.length;t++)
{
System.out.print(goal[t]+"--");
}
}
//快速排序算法
public static int[] QuickSort(int[] number) {
QuickSort(number, 0, number.length-1);
return number ;
}
private static void QuickSort(int[] number,int left, int right) {
int stmp;
if(left < right) {
System.out.println(left+" | "+right+" | "+(left+right)/2);
int s = number[(left+right)/2];
int i = left - 1;
int j = right + 1;
while(true) {
// 向右找
while(number[++i] > s) ;
// 向左找
while(number[--j] < s) ;
if(i >= j)
break;
stmp = number[i];
number[i] = number[j];
number[j] = stmp;
}
QuickSort(number, left, i-1); // 对左边进行递回
QuickSort(number, j+1, right); // 对右边进行递回
}
}
}
相关推荐
在Java编程语言中,对象排序是一项关键操作,特别是在处理集合数据结构时。本文将深入探讨如何对ArrayList、HashSet、TreeSet以及数组中的对象进行排序。理解这些排序机制对于编写高效且可维护的代码至关重要。 ...
在Java中实现归并排序,我们可以创建一个名为`MergeSort`的类来封装整个过程。归并排序的基本思想是将待排序的序列分成两个或更多的子序列,对每个子序列分别进行排序,然后将排序后的子序列合并成一个有序序列。这...
插入,堆和Shell排序,起泡排序,双向起泡和快速排序,经典的Hanoi塔问题的Java语言版 5.SoftwareLIVE是一个Java开发工具,包涵了各大知名厂商RAD系统的GUI开发环境,并透过完全视觉化的操作介面,让每个人都能轻易的...
在"java_suanfa"中,我们可以期待找到各种经典算法的实现,如排序算法(快速排序、归并排序、冒泡排序、插入排序、希尔排序、堆排序等)、查找算法(二分查找、哈希查找等)、图算法(深度优先搜索、广度优先搜索、...
Java排序算法是编程领域中的重要知识点,特别是在处理大量数据时,高效的排序算法能显著提升程序性能。本资源包含了Java实现的常见排序算法集合,对于学习和理解这些算法有着极大的帮助。 1. 冒泡排序(Bubble Sort...
3. 拓扑排序:在某些场景下,为了理解数据流或执行顺序,可能需要对拓扑图进行排序。Java 提供的图算法库可以帮助实现这一点,例如使用深度优先搜索(DFS)或广度优先搜索(BFS)算法。 4. 动态更新:在电信系统中...
`Java-master_排序_`这个项目很显然是一个专注于Java排序算法实现的代码库。在这个项目中,开发者可能封装了一系列的排序工具类或者方法,方便其他开发人员在处理数组、集合等数据结构时进行排序操作。 首先,我们...
标题中的"pdf_排序_java语言改写c_"表明这是一个关于将C语言的排序算法转换为Java语言的教程或参考资料。这个主题对学习Java编程的学生,尤其是那些有一定C语言基础的人来说非常有帮助,因为他们可以通过对比两种...
用线程来实现比较查找、排序算法的运行时间,第一部分是将顺序查找、折半查找算法设计成线程并同时运行来比较两种查找算法,第二部分是将冒泡排序、快速排序及选择排序设计成线程并同时运行来比较三种排序算法。...
根据给定的文件信息,我们可以总结出与Java排序相关的多个知识点。这些知识点涵盖了常见的排序算法实现,包括冒泡排序、选择排序以及如何使用Java内置的排序方法等。 ### Java排序算法实现 #### 1. 冒泡排序 冒泡...
标题中的“MLDN魔乐科技JAVA培训_Oracle课堂6_排序、单行函数.rar”表明这是一个关于Java编程和Oracle数据库的教程,特别是涉及到排序(Sorting)和单行函数(Single-row functions)的主题。这个压缩包可能包含了一...
包括_基础数据结构leetcode基本搜索算法基本排序算法Java8_stream_java_basic
使用冒泡排序实现的java语言编写的关于二维数组的排序,实现了行、列的排序输出。
基于_Java_与_ZeroMQ_的分布式排序系统,2022_年夏季“数学实践”课程的课程项目(大作_MRSort
5. **算法设计**:拼图游戏的核心是解决如何将打乱的拼图重新组合的问题,这可能涉及到排序算法(如快速排序或归并排序)或搜索算法(如深度优先搜索或广度优先搜索)。 6. **动画和定时器**:为了实现动态效果,如...
在给定的“java_code_of_algorithms.rar”压缩包中,包含了多个Java代码实现的数据结构和算法,重点涉及了最小生成树(Minimum Spanning Tree, MST)、深度优先搜索(Depth First Search, DFS)以及其他的排序算法。...
例如,`java.util.Comparator`接口中就添加了一个默认方法`thenComparing()`,方便用户进行多条件排序。 在安装Java 1.8.0_181时,你需要访问Oracle官方网站下载对应版本的JDK或JRE。通常,JDK包含JRE以及用于编译...
在Java编程语言中,对包含中文、数字和字母的数据进行排序是一项常见的任务。这个场景下,我们关注的是如何实现一个自定义的排序规则,按照数字、字母和汉字的顺序进行排列。以下是对这一主题的详细解释。 首先,...
JAVA实现拓扑排序,图中点的关系由邻接表实现
在本课程"MLDN魔乐科技JAVA培训_Oracle课堂6_排序、单行函数"中,我们将深入探讨Java编程与Oracle数据库中与排序和单行函数相关的知识点。这两个主题对于任何数据库开发者或Java应用程序员来说都是至关重要的,因为...