排序算法源码(JAVA)
public class Test { public static void main(String[] args){
Sort sort = new Sort();
sort.sortTest();
} }
public class Sort { public void sortTest() { int[] r = new int[]{,,,,,,,,};
int[] r1 = new int[]{-,,,,,,,,,}; insertSortTest(r);
shellSortTest(r);
bubbleSortTest(r);
quickSortTest(r);
selectSortTest(r);
heapSortTest(r1);
mergeSortTest(r1); ElemNode[] elemNodes = new ElemNode[];
for(int i = ; i < elemNodes.length; i++){
elemNodes[i] = new ElemNode();
elemNodes[i].key = 9 - i;
elemNodes[i].next = ;
}
KeyNode[] keyNodes = new KeyNode[]; //key为0-9
for(int j = ;j < keyNodes.length; j++){
keyNodes[j] = new KeyNode();
}
bucketSortTest(elemNodes,keyNodes); } public void insertSortTest(int[] r){
insertSort(r); System.out.print("Insertion Sort : ");
for(int i = ; i < r.length; i++){
System.out.print( r[i] + " ");
}
System.out.println();
} public void shellSortTest(int[] r){
shellSort(r); System.out.print("Shell Sort : ");
for(int i = ; i < r.length; i++){
System.out.print( r[i] + " ");
}
System.out.println();
} public void bubbleSortTest(int[] r){
bubbleSort(r); System.out.print("Bubble Sort : ");
for(int i = ; i < r.length; i++){
System.out.print(r[i] + " ");
}
System.out.println();
} public void quickSortTest(int[] r){
quickSort(r, , r.length - ); System.out.print("Quicksort : ");
for(int i = ; i < r.length; i++){
System.out.print(r[i] + " ");
}
System.out.println();
} public void selectSortTest(int[] r){
selectSort(r); System.out.print("Selection Sort : ");
for(int i = ; i < r.length; i++){
System.out.print( r[i] + " ");
}
System.out.println();
} //下标从1开始
public void heapSortTest(int[] r){
heapSort(r, r.length - ); //下标从1开始 System.out.print("Heap Sort : ");
for(int i = ; i < r.length; i++){
System.out.print( r[i] + " ");
}
System.out.println();
} //下标从1开始
public void mergeSortTest(int[] r){
int[] r1 = new int[r.length];
mergeSort(r, r1, r.length - ); //下标从1开始 System.out.print("Merge Sort : ");
for(int i = ; i < r.length; i++){
System.out.print(r[i] + " ");
}
System.out.println();
} public void bucketSortTest(ElemNode[] r, KeyNode[] q){
int index = bucketSort(r, r.length, q, q.length); System.out.print("Bucket Sort : "); for(int i = ; i < r.length; i++){
System.out.print(r[index].key + " ");
index = r[index].next;
}
System.out.println();
} //////////////////////////////////////////具体实现//////////////////////////////////////////// //////////////////////////////////////////直接插入排序//////////////////////////////////////////// public void insertSort(int[] r){ int temp, i ,j; for( i = ; i < r.length; i++){
temp = r[i];
for(j = i - ; j >= 0 && temp < r [j]; j-- )
r[j+] = r[j];
r[j+] = temp;
}
} //////////////////////////////////////////希尔实现//////////////////////////////////////////// public void shellSort(int[] r){ int temp, d, i , j; for(d = r.length/; d >= ; d = d/){
for(i = d ; i < r.length; i++){
temp = r[i];
for(j = i - d; j >= 0 && temp < r[j]; j = j-d)
r[j+d] = r[j];
r[j+d] = temp;
}
}
} //////////////////////////////////////////冒泡排序//////////////////////////////////////////// public void bubbleSort(int[] r){ int exchange = r.length - ;//动态记录过程
int bound = r.length - ;//冒泡边界初始化 while (exchange != -){
bound = exchange;//冒泡排序边界
exchange = -; //交换过程记录 for(int i = ; i < bound; i++){
if (r[i] > r[i+]){
int temp = r[i];
r[i] = r[i+];
r[i+] = temp; exchange = i;
}
}
} } //////////////////////////////////////////快速排序//////////////////////////////////////////// public int partition(int[] r, int first, int end){ int i = first, j = end ,temp; while (i < j){
while (i < j && r[i] < r[j]) j--;
if (i < j ) {
temp = r[i];
r[i] = r[j];
r[j] = temp; i++;
} while (i < j && r[i] < r[j]) i++;
if(i < j){
temp = r[i];
r[i] = r[j];
r[j] = temp; j--;
}
}
return i;
} public void quickSort(int[] r, int first, int end){
if (first < end){
int p = partition(r,first, end);
quickSort(r,first,p - );
quickSort(r,p + ,end);
}
} //////////////////////////////////////////选择排序//////////////////////////////////////////// public void selectSort(int[] r){ int index;//记录临时最小值序号 for(int i = ;i < r.length - ; i++){ index = i; //初始化最小序号为当前位置序号 for(int j = i + ; j < r.length; j++)//从当前序号后(无序区)选最小值
if(r[j] < r[index]) index = j; if (index != i){ //根据最小值下标与当前位置交换
int temp = r[index];
r[index] = r[i];
r[i] = temp;
}
}
} //////////////////////////////////////////堆排序//////////////////////////////////////////// //堆存储结构:元素在数组中按层序遍历顺序排序(下标从1开始) //(子堆已经建好后)调整堆顶
public void sift(int[] r, int k, int m){ //从小到大排:建立最大堆
//k:堆顶序号 m:最后节点序号
int i = k , j = 2 * i; //i:堆顶序号 j:堆顶孩子节点序号
while(j <= m){
if(j < m && r[j] < r[j+]) j++; //j为左右子节点中较大的 if(r[i] < r[j]){ //交换父子节点
int temp = r[i];
r[i] = r[j];
r[j] = temp; i = j; j = 2 * i; //调整改变堆顶后的子堆
}
else break;
}
} //堆排序:由下至上建立堆,堆顶元素交换到数组尾部
public void heapSort(int[] r, int n){ for(int i = n/; i >= ; i--){ //由下至上建立堆
sift(r,i,n);
} for(int i = ; i < n; i++){ //i:第i次取顶 //堆顶元素交换到数组尾部(排序)
int temp = r[];
r[] = r[n - (i - )];
r[n - (i - )] = temp; sift(r,,n - i);//对堆顶重新建堆(未排序)
} } //////////////////////////////////////////归并排序//////////////////////////////////////////// public void merge(int[] r, int[] r1, int s, int m, int t)//一节
{
int i = s, j = m + ; //r下标
int k = s; //r1下标 while(i <= m && j <= t) //取两子序列r[i] r[j]中较小者放入r1
{
if(r[i] < r[j]) r1[k++] = r[i++];
else r1[k++] = r[j++];
} //收尾处理
if(i <= m)
while(i <= m) r1[k++] = r[i++];
else
while(j <= t) r1[k++] = r[j++]; } public void mergePass(int r[], int r1[], int n, int h)//一趟(总长n,子序列长h)
{
int i = ; //下标从1开始
while(i < n - *h + ) //归并{h, h}
{
merge(r, r1, i, i+h-, i+*h-);
i = i + *h;
}
if(i < n - h + ) //归并{h, <h}
merge(r, r1, i, i+h-, n);
else //归并 <h
for(int k = i; k <= n ;k++) r1[k] = r[k];
} public void mergeSort(int r[], int r1[], int n)
{
int h = ;
while(h < n){
mergePass(r, r1, n, h); //r -> r1
h = *h;
mergePass(r1, r, n, h); //r1 -> r
h = *h;
}
} //////////////////////////////////////////桶排序//////////////////////////////////////////// public class ElemNode //静态链表
{
ElemNode(){}
public int key; //排序索引
// int value; //具体值
public int next; //静态链表的next index
} public class KeyNode //key桶
{
public int front; //桶首的静态链表index
public int rear; //桶尾的静态链表index
} //分配
public void distribute(ElemNode[] r, int n, KeyNode[] q, int m)
{
int i = 0 ; //静态链表从0开始 while(i < n) //扫描静态链表
{
int k = r[i].key;
if(q[k].front == -) q[k].front = i; //key桶为空:设置key桶头部
else r[q[k].rear].next = i; //key桶非空:静态链表连接桶元素 q[k].rear = i; //设置key桶尾部 i++; //i后移,处理静态链表下一个元素
}
} //收集
public int collect(ElemNode[] r, int n, KeyNode[] q, int m)
{
int k = ; //key桶从0开始
while(q[k].front == -) k++; //找到第一个非空key桶 int first = q[k].front; //静态链表首部index
int last = q[k].rear; //静态链表尾部index while (k < m) //扫描key桶
{
k++;
if (k < m && q[k].front != -) //找到下一个非空key桶
{
r[last].next = q[k].front; //静态链表连接
last = q[k].rear; //修改静态链表尾部index
}
}
r[last].next = -; //设置静态链表排序后尾部标志 return first; //返回排序后的静态链表首部index
} public int bucketSort(ElemNode[] r, int n, KeyNode[] q, int m)
{
//初始化静态链表
for(int i = ; i < n; i++) r[i].next = i + ;
r[n - ].next = -; //尾标志为-1 //初始化key桶
for(int j = ; j < m; j++){
q[j].front = -;
q[j].rear = -;
} distribute(r,n,q,m);
return collect(r,n,q,m);
} }
排序算法源码(JAVA)的更多相关文章
- C语言的经典排序算法源码
1.插入排序:插入法是一种比较直观的排序方法.它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置.把数组元素插完也就完成了排序.代码如下: #include<stdio.h> ...
- 排序算法总结(基于Java实现)
前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结
Atitit 图像清晰度 模糊度 检测 识别 评价算法 源码实现attilax总结 1.1. 原理,主要使用像素模糊后的差别会变小1 1.2. 具体流程1 1.3. 提升性能 可以使用采样法即可..1 ...
- mahout算法源码分析之Collaborative Filtering with ALS-WR拓展篇
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 额,好吧,心头的一块石头总算是放下了.关于Collaborative Filtering with AL ...
- mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...
- mahout算法源码分析之Collaborative Filtering with ALS-WR 并行思路
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. mahout算法源码分析之Collaborative Filtering with ALS-WR 这个算 ...
- diff.js 列表对比算法 源码分析
diff.js列表对比算法 源码分析 npm上的代码可以查看 (https://www.npmjs.com/package/list-diff2) 源码如下: /** * * @param {Arra ...
- [Spark内核] 第34课:Stage划分和Task最佳位置算法源码彻底解密
本課主題 Job Stage 划分算法解密 Task 最佳位置算法實現解密 引言 作业调度的划分算法以及 Task 的最佳位置的算法,因为 Stage 的划分是DAGScheduler 工作的核心,这 ...
- zookeeper集群搭建及Leader选举算法源码解析
第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...
随机推荐
- gui线程
package thread; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.Acti ...
- LXPanel自定义添加应用程序到快速启动栏
LXPanel是Linux下LXDE项目的一个桌面面板软件.我一开始接触的时候,对于自己自定义的程序到快速启动栏绕了很多弯路,这里记录下,防止以后自己忘了.还有一点就是很多时候,panel下的应用程序 ...
- 跟我一起学CMake
如今CMake使用的人数越来越多,包括我项目组里,很多大牛们在写Qt程序的时候都不用自带的qmake,貌似会出现很多问题,他们往往都用自己写的CMake来编译系统,今天我也和大家一起来学学这个高大上的 ...
- websphere节点、单元、服务之间的关系
单元(cell).节点(node).概要文件(profile).服务(server) 在websphere集群(ND版本)模式下: 一个cell单元可以包含多个node节点,node=profile, ...
- js获取ip方法
<script type="text/javascript" src="http://counter.sina.com.cn/ip/" charset=& ...
- Light OJ 1104 第六周F题
F - 概率(经典问题) Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Descri ...
- linux c数据库备份第二版
#想知道更多请查看第一版"linux c数据库备份第一版" #include<sys/types.h> #include<sys/wait.h> #incl ...
- winform 绘制label 中文字 - 摘
private void label2_Paint(object sender, PaintEventArgs e) {//绘制label中文字 string text = "Sri Lan ...
- STM32库中 __IO 修饰符(volatile修饰符)
STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay; 这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原 ...
- could only be replicated to 0 nodes, instead of 1
周末机房断电,然后hadoop爆出如题的错误,解决方案就是关闭所有节点的防火墙,相关命令如下: 查看防火墙状态: /etc/init.d/iptables status 暂时关闭防火墙: /etc/i ...