package com.cjs.sort;

/**
* 此类用来提供针对整数的各种排序算法
*
* @author S
* @version 1.0
*/
public class MySort { /**
* 冒泡排序来实现一系列整数的升序排列,改变了传入的数组
*
* @param a
* 传入的整形数组,对其进行排序的目标数组
* @return void
*/
public static void bubbleSort(int a[]) { int n = a.length;
for (int i = 1; i <= n - 1; i++) {
for (int j = 0; j < n - i; j++) {
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
} } /**
* 选择排序来实现一系列整数的升序排列,改变了传入的数组
*
* @param a
* 传入的整形数组,对其进行排序的目标数组
* @return void
*/
public static void selectSort(int[] a){ int n = a.length; for(int i = 0; i < n; i++){
int x = a[i], k = i;
for(int j = i+1; j < n; j++){
if(a[j] < x){
x = a[j];
k = j;
}
} a[k] = a[i];
a[i] = x;
} } /**
* 插入排序来实现一系列整数的升序排列,改变了传入的数组
*
* @param a
* 传入的整形数组,对其进行排序的目标数组
* @return void
*/
public static void insertSort(int[] a){ int n = a.length; for(int i = 1; i < n; i++){
int x = a[i],k = i;
for(int j = i-1; j >= 0; j--){
if(a[j] > x){
a[j+1] = a[j];
k = j;
}
}
a[k] = x;
} } static int[] temp = new int[100 * 100]; // 归并排序所用到的临时数组 /**
* 归并排序来实现一系列整数的升序排列,改变了传入的数组,所排数组的大小不能超过10000
*
* @param a
* 传入的整形数组,对其进行排序的目标数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return void
*/
public static void mergeSort(int a[], int left, int right) { // 至少有两个元素,也是递归的结束条件
if (left < right) {
int mid = (left + right) / 2;
mergeSort(a, left, mid);
mergeSort(a, mid + 1, right);
// 合并到临时数组temp
Merge(a, temp, left, mid, right);
// 复制回数组a
Copy(a, temp, left, right);
} } /**
* 归并排序中的合并操作,将二分后的数组按升序排列
*
* @param a
* 传入的数组
* @param t
* 要合并到的临时数组
* @param left
* 传入数组的左边界下标
* @param mid
* 传入数组的中间下标
* @param right
* 传入数组的右边界下标
* @return void
*/
private static void Merge(int a[], int t[], int left, int mid, int right) { // 合并c[1:m]和c[m+1:r]到d[l,r]
int i = left, j = mid + 1, k = left;
// 两表中元素比较,类似于打擂台,大的复制到临时数组中
while (i <= mid && j <= right) {
if (a[i] < a[j]) {
t[k++] = a[i++];
} else {
t[k++] = a[j++];
}
} // 若前一个子序列剩余,则直接复制入临时数组
if (i > mid) {
for (int q = j; q <= right; q++)
t[k++] = a[q];
}
// 后一个子序列
else {
for (int q = i; q <= mid; q++)
t[k++] = a[q];
} } /**
* 归并排序中的复制操作,将数据从临时数组中复制到传入的原数组
*
* @param a
* 传入的数组
* @param t
* 保存数据的临时数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return void
*/
private static void Copy(int a[], int t[], int left, int right) { for (int i = left; i <= right; i++)
a[i] = t[i]; } /**
* 快速排序来实现一系列整数的升序排列,改变了传入的数组
*
* @param a
* 传入的整形数组,对其进行排序的目标数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return void
*/
public static void quickSort(int a[], int left, int right) { if (left < right) {
int x = Partition(a, left, right);
quickSort(a, left, x - 1);
quickSort(a, x + 1, right);
} } /**
* 快速排序中用来对元素进行划分,基准元素为a[left]
*
* @param a
* 传入的整形数组,对其进行排序的目标数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return i 划分后基准元素所处位置的下标
*/
private static int Partition(int[] a, int left, int right) { int x = a[left];
int i = left, j = right; while (i < j) { while (i < j && a[j] >= x)
j--;
if (i < j) {
a[i] = a[j];
i++;
} while (i < j && a[i] < x)
i++;
if (i < j) {
a[j] = a[i];
j--;
} }
a[i] = x; return i;
} }

泛型实现:

package com.cjs.alogrithm;

/**
* 此类采用泛型方法来提供对各种类型数据的各种排序算法
*
* @author S
* @version 1.0
*/
public class MySort { /**
* 冒泡排序来实现一系列数据的升序排列,改变了传入的数组
*
* @param a
* 传入的存储数据的数组,对其进行排序的目标数组
* @return void
*/
public static <T extends Comparable<T>> void bubbleSort(T a[]) { int n = a.length;
for (int i = 1; i <= n - 1; i++) {
for (int j = 0; j < n - i; j++) {
if ((a[j]).compareTo(a[j + 1]) > 0) {
T t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
} } /**
* 选择排序来实现一系列数据的升序排列,改变了传入的数组
*
* @param a
* 传入的存储数据数组,对其进行排序的目标数组
* @return void
*/
public static <T extends Comparable<T>> void selectSort(T[] a) { int n = a.length; for (int i = 0; i < n; i++) {
T x = a[i];
int k = i;
for (int j = i + 1; j < n; j++) {
if (a[j].compareTo(x) < 0) {
x = a[j];
k = j;
}
} a[k] = a[i];
a[i] = x;
} } /**
* 插入排序来实现一系列数据的升序排列,改变了传入的数组
*
* @param a
* 传入的存储数据的数组,对其进行排序的目标数组
* @return void
*/
public static <T extends Comparable<T>> void insertSort(T[] a) { int n = a.length; for (int i = 1; i < n; i++) {
T x = a[i];
int k = i;
for (int j = i - 1; j >= 0; j--) {
if (a[j].compareTo(x) > 0) {
a[j + 1] = a[j];
k = j;
}
}
a[k] = x;
} } /**
* 归并排序来实现一系列数据的升序排列,改变了传入的数组,需要额外提供一个临时数组来辅助排序
*
* @param a
* 传入的存储数据的数组,对其进行排序的目标数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return void
*/
public static <T extends Comparable<T>> void mergeSort(T a[], T temp[],
int left, int right) { // 至少有两个元素,也是递归的结束条件
if (left < right) {
int mid = (left + right) / 2;
mergeSort(a, temp, left, mid);
mergeSort(a, temp, mid + 1, right);
// 合并到临时数组temp
Merge(a, temp, left, mid, right);
// 复制回数组a
Copy(a, temp, left, right);
} } /**
* 归并排序中的合并操作,将二分后的数组按升序排列
*
* @param a
* 传入的数组
* @param t
* 要合并到的临时数组
* @param left
* 传入数组的左边界下标
* @param mid
* 传入数组的中间下标
* @param right
* 传入数组的右边界下标
* @return void
*/
private static <T extends Comparable<T>> void Merge(T a[], T t[], int left,
int mid, int right) { // 合并c[1:m]和c[m+1:r]到d[l,r]
int i = left, j = mid + 1, k = left;
// 两表中元素比较,类似于打擂台,大的复制到临时数组中
while (i <= mid && j <= right) {
if (a[i].compareTo(a[j]) < 0) {
t[k++] = a[i++];
} else {
t[k++] = a[j++];
}
} // 若前一个子序列剩余,则直接复制入临时数组
if (i > mid) {
for (int q = j; q <= right; q++)
t[k++] = a[q];
}
// 后一个子序列
else {
for (int q = i; q <= mid; q++)
t[k++] = a[q];
} } /**
* 归并排序中的复制操作,将数据从临时数组中复制到传入的原数组
*
* @param a
* 传入的数组
* @param t
* 保存数据的临时数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return void
*/
private static <T extends Comparable<T>> void Copy(T a[], T t[], int left,
int right) { for (int i = left; i <= right; i++)
a[i] = t[i]; } /**
* 快速排序来实现一系列数据的升序排列,改变了传入的数组
*
* @param a
* 传入的存储数据的数组,对其进行排序的目标数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return void
*/
public static <T extends Comparable<T>> void quickSort(T a[], int left,
int right) { if (left < right) {
int x = Partition(a, left, right);
quickSort(a, left, x - 1);
quickSort(a, x + 1, right);
} } /**
* 快速排序中用来对元素进行划分,基准元素为a[left]
*
* @param a
* 传入的存储数据的数组,对其进行排序的目标数组
* @param left
* 传入数组的左边界下标
* @param right
* 传入数组的右边界下标
* @return i 划分后基准元素所处位置的下标
*/
private static <T extends Comparable<T>> int Partition(T[] a, int left,
int right) { T x = a[left];
int i = left, j = right; while (i < j) { while (i < j && a[j].compareTo(x) >= 0)
j--;
if (i < j) {
a[i] = a[j];
i++;
} while (i < j && a[i].compareTo(x) < 0)
i++;
if (i < j) {
a[j] = a[i];
j--;
} }
a[i] = x; return i;
} }

java 实现排序的更多相关文章

  1. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  2. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  3. java 集合排序(转)

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  4. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  5. java常见排序方法

    1.java常用排序方法 1) 选择排序         原理:a. 将数组中的每个元素,与第一个元素比较          如果这个元素小于第一个元素, 就将这个         两个元素交换.   ...

  6. java希尔排序

    java希尔排序 1.基本思想: 希尔排序也成为"缩小增量排序",其基本原理是,现将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插 ...

  7. Java八大排序算法

    Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...

  8. Java常用排序算法及性能测试集合

    测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...

  9. java 集合排序

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  10. Java各种排序算法

      Java各种排序算法详解 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有 ...

随机推荐

  1. 【剑指offer】面试题40:数组中只出现一次的数字

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...

  2. c语言通过时间种子产生随机数并选出最大值以及下标

    1 #include <stdio.h> #include <stdlib.h> #include <time.h> //2016 10 10 void main( ...

  3. NetAnalyzer笔记 之 三. 用C++做一个抓包程序

    [创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 经过前两篇的瞎扯,你是不是已经厌倦了呢,那么这篇让我们来点有意思的吧,什么,用C#.不,这篇我们先来C++的 Wi ...

  4. 使用IDEA动态调试smali代码

    原创,转载请注明出处. 一般java ide(如eclipse.idea)都可用来进行smali的动态调试,这里选择IDEA. 第1步:使用apktool反编译apk java -jar apktoo ...

  5. Codeforces Round #143 (Div. 2) (ABCD 思维场)

    题目连链接:http://codeforces.com/contest/231 A. Team time limit per test:2 seconds memory limit per test: ...

  6. Android中Service类onStartCommand

    Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart ...

  7. 远程连接到Fedora

    首先执行以下3点(主要是前两点) 第一: 开启ssh #service sshd restart 第二:关闭防火墙 #service iptables stop 第三:selinux(重启电脑后失效) ...

  8. 那些容易忽略的事4-(正则表达式反向引用\n)

    n 是一个正整数.一个反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串. ps1:从左开始数,从左到优,也是从外到里,依次是\1,\2,\3... ...

  9. SVN二次开发——让SVN、TSVN(TortoiseSVN)支持windows的访问控制模型、NTFS ADS(可选数据流、NTFS的安全属性)

    SVN二次开发 ——让SVN.TSVN(TortoiseSVN)支持windows的访问控制模型.NTFS ADS (可选数据流.NTFS的安全属性) SVN secondary developmen ...

  10. Java 中关键字transient引出序列化与反序列化

    一:transient(临时的)关键字 1.transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被transient关键字修饰的. 2.被transient关键字修饰的变量不 ...