1 插入排序
1.1、直接插入排序
package org.com.sort;
public class InsertSort {
public static void insert_sort(int a[], int n) {
for(int i = 1; i < n; i++) {
if(a[i] < a[i-1]) {
int j = i - 1;
int temp = a[i];
while(j >= 0 && a[j] > temp) {
a[j+1] = a[j];
j--;
}
a[j+1] = temp;
}
}
}
public static void main(String[] args) {
int a[] = {4,3,2,1};
insert_sort(a, a.length);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println();
}
}
1.2 希尔排序
标准希尔排序:
package org.com.sort;
public class ShellInsertSort {
public static void shell_insert_sort1(int a[], int n) {
for(int dk = n/2; dk > 0; dk /= 2) {
for(int i = 0; i < dk; i++) {
for(int j = i + dk; j < n; j += dk) {
if(a[j] < a[j-dk]) {
int temp = a[j];
int k = j - dk;
while(k >= 0 && a[k] > temp) {
a[k+dk] = a[k];
k -= dk;
}
a[k + dk] = temp;
}
}
}
}
}
public static void main(String[] args) {
int a[] = {3,4,6,3,1,7,9,4};
shell_insert_sort1(a, a.length);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println();
}
}
上述希尔排序虽然容易理解,但代码不够简洁,下述为从dk-n直接的按照dk长度进行排序:
package org.com.sort;
public class ShellInsertSort {
public static void shell_insert_sort2(int a[], int n) {
for(int dk = n/2; dk > 0; dk /= 2) {
for(int i = dk; i < n; i++) {
if(a[i] < a[i - dk]) {
int temp = a[i];
int j = i - dk;
while(j >= 0 && a[j] > temp) {
a[j + dk] = a[j];
j -= dk;
}
a[j + dk] = temp;
}
}
}
}
public static void main(String[] args) {
int a[] = {3,4,6,3,1,7,9,4};
shell_insert_sort2(a, a.length);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println();
}
}
2 选择排序
2.1 直接选择排序
package org.com.sort;
public class SimpleSelectSort {
public static void simple_select_sort(int a[], int n) {
for(int i = 0; i < n; i++) {
int index = i;
for(int j = i + 1; j < n; j++) {
if(a[index] > a[j]) {
index = j;
}
}
if(i != index) {
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
}
public static void main(String args[]) {
int a[] = {3,12,6,3,0,7,9,4, 1, 10, 78};
simple_select_sort(a, a.length);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println();
}
}
2.1 堆排序
package com.sort2.select;
public class HeapSort {
public static void heapAdjust(int a[], int i , int size) {
int lchild = 2 * i + 1;
int rchild = 2 * i + 2;
int max = i;
if(lchild < size) {
if(rchild < size && a[max] < a[rchild])
max = rchild;
if(a[max] < a[lchild])
max = lchild;
if(i != max) {
int temp = a[i];
a[i] = a[max];
a[max] = temp;
heapAdjust(a, max, size);
}
} else {
return ;
}
}
public static void buildHeap(int a[], int size) {
for(int i = size / 2; i >= 0; i--) {
heapAdjust(a, i, size);
}
}
public static void heap_sort(int a[], int size) {
buildHeap(a, size);
for(int i = size - 1; i >= 0; i--) {
int temp = a[0];
a[0] = a[i];
a[i] = temp;
heapAdjust(a, 0, i);
}
}
public static void main(String args[]) {
int a[] = {4,5,2,8,9,1,8,3,0};
heap_sort(a, a.length);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println();
}
}
3 交换排序
3.1 冒泡排序
package com.sort2.change;
public class BubbleSort {
public static void bubble_sort(int a[], int n) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n - i - 1; j++) {
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
public static void main(String args[]) {
int a[] = {4,5,2,8,9,1,8,3,0};
bubble_sort(a, a.length);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println();
}
}
3.2 快速排序
package com.sort2.change;
public class QuitSort {
public static void quik_sort(int a[], int left, int right) {
if(left >= right) return ;
int i = left;
int j = right;
int temp = a[i];
while(i < j) {
while(i < j && a[j] >= temp) j--;
if(i < j)
a[i++] = a[j];
while(i < j && a[i] <= temp) i++;
if(i < j)
a[j--] = a[i];
}
a[i] = temp;
quik_sort(a, left, i - 1);
quik_sort(a, i+ 1, right);
}
public static void main(String args[]) {
int a[] = {4,5,2,8,9,1,8,3,0};
quik_sort(a, 0, a.length - 1);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + "\t");
}
System.out.println();
}
}