java 常用五种排序
2016-03-28 14:35
323 查看
//冒泡排序
//依次比较相邻的两个元素,通过一次比较把未排序序列中最大(或最小)的元素放置在未排序序列的末尾。
public static void BubbleSort (int data[]) {
for (int i = 0; i < data.length -1; i++) {
for (int j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
int temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
}
//选择排序
/**
每一次从待排序的数据元素中选出最小(或最大)的一个元素,
顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
**/
public static void SelectionSort (int data[]) {
int minVal;
int minIndex;
for (int i = 0; i < data.length - 1; i++) {
minVal = data[i];
minIndex = i;
for (int j = i + 1; j < data.length; j++) {
if (data[j] < minVal) {
minVal = data[j];
minIndex = j;
}
}
if (minVal != data[i] && minIndex != i) {
data[minIndex] = data[i];
data[i] = minVal;
}
}
}
//插入排序
/**
将数列分为有序和无序两个部分,
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,
找出插入位置,将该元素插入到有序数列的合适位置中。
* **/
public static void InsertionSort (int data[]) {
for (int i = 1; i < data.length; i++) {
for (int j = i; j > 0; j--) {
if (data[j] < data[j - 1]) {
int temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
}
}
}
}
//快速排序
/**
通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都小,
然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
**/
public static void Quicksort(int data[], int start, int end) {
if (end - start <= 0) {
return;
}
int last = start;
for (int i = start + 1; i <= end; i++) {
if (data[i] < data[start]) {
int temp = data[++last];
data[last] = data[i];
data[i] = temp;
}
}
int temp = data[last];
data[last] = data[start];
data[start] = temp;
Quicksort(data, start, last - 1);
Quicksort(data, last + 1, end);
}
//归并排序
/**
将两个(或两个以上)有序表合并成一个新的有序表,
即把待排序序列分为若干个子序列,每个子序列是有序的。
然后再把有序子序列合并为整体有序序列。排序过程如下:
(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
(2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
(4)重复步骤3直到某一指针达到序列尾
(5)将另一序列剩下的所有元素直接复制到合并序列尾
**/
public static void sort(int data[], int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
sort(data, start, mid);
sort(data, mid + 1, end);
merge(data, start, mid, end);
}
}
public static void merge(int data[], int start, int mid, int end) {
int temp[] = new int[end - start + 1];
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (data[i] < data[j]) {
temp[k++] = data[i++];
} else {
temp[k++] = data[j++];
}
}
while (i <= mid) {
temp[k++] = data[i++];
}
while (j <= end) {
temp[k++] = data[j++];
}
for (k = 0, i = start; k < temp.length; k++, i++) {
data[i] = temp[k];
}
}
//依次比较相邻的两个元素,通过一次比较把未排序序列中最大(或最小)的元素放置在未排序序列的末尾。
public static void BubbleSort (int data[]) {
for (int i = 0; i < data.length -1; i++) {
for (int j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
int temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
}
//选择排序
/**
每一次从待排序的数据元素中选出最小(或最大)的一个元素,
顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
**/
public static void SelectionSort (int data[]) {
int minVal;
int minIndex;
for (int i = 0; i < data.length - 1; i++) {
minVal = data[i];
minIndex = i;
for (int j = i + 1; j < data.length; j++) {
if (data[j] < minVal) {
minVal = data[j];
minIndex = j;
}
}
if (minVal != data[i] && minIndex != i) {
data[minIndex] = data[i];
data[i] = minVal;
}
}
}
//插入排序
/**
将数列分为有序和无序两个部分,
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,
找出插入位置,将该元素插入到有序数列的合适位置中。
* **/
public static void InsertionSort (int data[]) {
for (int i = 1; i < data.length; i++) {
for (int j = i; j > 0; j--) {
if (data[j] < data[j - 1]) {
int temp = data[j];
data[j] = data[j - 1];
data[j - 1] = temp;
}
}
}
}
//快速排序
/**
通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都小,
然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
**/
public static void Quicksort(int data[], int start, int end) {
if (end - start <= 0) {
return;
}
int last = start;
for (int i = start + 1; i <= end; i++) {
if (data[i] < data[start]) {
int temp = data[++last];
data[last] = data[i];
data[i] = temp;
}
}
int temp = data[last];
data[last] = data[start];
data[start] = temp;
Quicksort(data, start, last - 1);
Quicksort(data, last + 1, end);
}
//归并排序
/**
将两个(或两个以上)有序表合并成一个新的有序表,
即把待排序序列分为若干个子序列,每个子序列是有序的。
然后再把有序子序列合并为整体有序序列。排序过程如下:
(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
(2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
(4)重复步骤3直到某一指针达到序列尾
(5)将另一序列剩下的所有元素直接复制到合并序列尾
**/
public static void sort(int data[], int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
sort(data, start, mid);
sort(data, mid + 1, end);
merge(data, start, mid, end);
}
}
public static void merge(int data[], int start, int mid, int end) {
int temp[] = new int[end - start + 1];
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (data[i] < data[j]) {
temp[k++] = data[i++];
} else {
temp[k++] = data[j++];
}
}
while (i <= mid) {
temp[k++] = data[i++];
}
while (j <= end) {
temp[k++] = data[j++];
}
for (k = 0, i = start; k < temp.length; k++, i++) {
data[i] = temp[k];
}
}
相关文章推荐
- java学习笔记(三)
- Spring MVC Spring MyBatis 整合 - 快速上手
- JAVA基础-多态
- Properties类 of Java 的使用
- Spring Security 学习笔记-信道过滤器
- java.util.HashMap.remove()方法实例
- java 抽象工厂模式
- 通俗的解释JAVA wait/notify机制
- 1分钟教会你SpringMvc 文件上传
- java 简单工厂模式
- java 静态语句块(static block)
- JVM--内存管理模型
- 深入Java集合系列之四:ConcurrentHashMap
- myeclipse2013 git插件安装
- Eclipse设置文件默认打开方式
- java--vo
- java反射机制续
- 在Eclipse中创建Maven多模块工程
- Constants in java
- java LinkedList 的实现