冒泡排序:
相邻的元素进行比较。
public class 冒泡排序 {
public static void main(String[] args) {
int[] a = {2, 8, 20, 6, 7, 8, 5, 8, 100, 9};
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length-i-1; j++) {
if (a[j]>a[j+1]) {
exch(a, j, j+1);
}
}
}
System.out.println(Arrays.toString(a));
}
private static void exch(int[] a, int i, int j) {
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
private static boolean less(int i, int j) {
return i > j;
}
}
选择排序:
每轮首位与最小(或最大)索引所对应的元素进行比较
public class 选择排序 {
public static void main(String[] args) {
int[] a = {2, 8, 20, 6, 7, 8, 5, 8, 100, 9};
int temp;
System.out.println(Arrays.toString(a));
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i + 1; j < a.length; j++) {
if (a[min] > a[j]) min = j;
}
exch(a, i, min);
}
System.out.println(Arrays.toString(a));
}
private static void exch(int[] a, int i, int j) {
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
插入排序:
相邻元素进行比较,每一轮比较结束,数组都是有序的
public class 插入排序 {
public static void main(String[] args) {
int[] a = {2, 8, 20, 6, 7, 5, 100, 9};
for (int i = 1; i < a.length; i++) {
for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
exch(a, j);
}
}
System.out.println(Arrays.toString(a));
}
private static boolean less(int i, int j) {
return i < j;
}
private static void exch(int[] a, int j) {
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
希尔排序(shell):
为了加快速度简单的改进了插入排序
h有序数组:数组中任意间隔为h的元素都是有序的。h公因子的选择
public class 希尔排序 {
public static void main(String[] args) {
int array[] = {3, 11, 5, 8, 3, 2, 456, 3, 2, 8, 9, 98, 77, 1, 58, 91};
System.out.println(Arrays.toString(array));
int N = array.length;
int h = N/2;
int temp;
while (h >= 1) {
for (int i = h; i < N; i++) {
for (int j = i; j >= h && array[j] < array[j - h]; j -= h) {
temp = array[j - h];
array[j - h] = array[j];
array[j] = temp;
}
}
System.out.println();
h = h / 2;
}
}
}
class A {
public static void main(String args[]) {
int a[] = {3, 11, 5, 8, 3, 2, 456, 3, 2, 8, 9, 98, 77, 1, 58, 91};
int N = a.length;
int h = 1;
int temp;
while (h < N / 3) h = 3 * h + 1;
while (h >= 1) {
for (int i = h; i < N; i++) {
for (int j = i; j >= h && a[j] < a[j - h]; j -= h) {
temp = a[j - h];
a[j - h] = a[j];
a[j] = temp;
}
}
System.out.println(Arrays.toString(a));
h = h / 3;
}
System.out.println(Arrays.toString(a));
}
}
归并排序:
归并排序:将一个数组递归的分成两半排序,然后将结果归并起来
口诀:
左完必取右
右完必取左
谁小就取谁
取谁谁必增
public class 归并排序 {
public static void main(String[] args) {
int a[] = {3, 99, 5, 8, 11, 2, 2, 4, 8, 456};
int N = a.length;
int aux[] = new int[N];
int low = 0;
int high = N - 1;
int mid = low + (high - low) / 2;
int i = low;
int j = mid + 1;
for (int k = low; k < N; k++) aux[k] = a[k];
for (int k = low; k < N; k++) {
if (i > mid) {
a[k] = aux[j++];
} else if (j > high) {
a[k] = aux[i++];
} else if (aux[j] > aux[i]) {
a[k] = aux[i++];
} else {
a[k] = aux[j++];
}
}
System.out.println(Arrays.toString(a));
}
}
class Merge {
private static int[] aux;
private static void sort(int[] a) {
aux = new int[a.length];
sort(a, 0, a.length - 1);
}
private static void sort(int[] a, int low, int high) {
if (high <= low) return;
int mid = low + (high - low) / 2;
sort(a, low, mid);
sort(a, mid + 1, high);
merge(a, low, high, mid);
}
private static void merge(int[] a, int low, int high, int mid) {
int i = low;
int j = mid + 1;
for (int k = low; k <= high; k++) {
aux[k] = a[k];
}
for (int k = low; k <= high; k++) {
if (i > mid) a[k] = aux[j++];
else if (j > high) a[k] = aux[i++];
else if (aux[i] < aux[j]) a[k] = aux[i++];
else a[k] = aux[j++];
}
}
public static void main(String[] args) {
int a[] = {3, 99, 5, 8, 11, 2, 2, 4, 8, 456};
sort(a);
System.out.println(Arrays.toString(a));
}
}
class MergeBU {
private static int[] aux;
private static void sort(int[] a) {
int N = a.length;
aux = new int[a.length];
for (int sz = 1; sz < N; sz *= 2) {
for (int id = 0; id < N - sz; id += 2 * sz) {
merge(a, id, sz + id - 1, Math.min(id + 2 * sz - 1, N - 1));
System.out.println("merge(" + "a" + "," + id + "," + (sz + id - 1) + "," + Math.min(id + 2 * sz - 1, N - 1) + ")");
}
System.out.println();
}
}
private static void merge(int[] a, int low, int mid, int high) {
int i = low;
int j = mid + 1;
for (int k = low; k <= high; k++) {
aux[k] = a[k];
}
for (int k = low; k <= high; k++) {
if (i > mid) a[k] = aux[j++];
else if (j > high) a[k] = aux[i++];
else if (aux[i] < aux[j]) a[k] = aux[i++];
else a[k] = aux[j++];
}
}
public static void main(String[] args) {
int a[] = {3, 99, 5, 8, 11, 2, 2, 4, 8, 456};
sort(a);
System.out.println(Arrays.toString(a));
}
}
快速排序:
归并排序是将两个分别有序的数组归并使其有序,而快排是将两个有序数组分别有序时,整个数组便是有序的。
可以理解为分区,左区子数组都是小元素,中区都是重复中元素,右区都是大元素。当这三个区分别有序时,整个数组便都是有序的。
public class 快速排序 {
public static void main(String[] args) {
int a[] = {3, 99, 5, 11, 11, 78, 11, 4, 11, 456};
sort(a);
System.out.println(Arrays.toString(a));
}
public static void sort(int a[]) {
sort(a, 0, a.length - 1);
}
private static void sort(int[] a, int low, int high) {
if (low >= high) return;
int result = partition(a, low, high);
sort(a, low, result);
sort(a, result + 1, high);
}
private static int partition(int[] a, int low, int high) {
int i = low;
int j = high + 1;
while (true) {
while (a[low] >= a[++i]) if (i == high) break;
while (a[low] <= a[--j]) if (j == low) break;
if (i >= j) break;
exch(a, i, j);
}
exch(a, low, j);
return j;
}
private static void exch(int[] a, int i, int j) {
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
class 三向切分法{
public static void main(String[] args) {
int[] a = {3, 99, 5, 11, 11, 78, 11, 4, 11, 456};
sort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
private static void sort(int[] a, int low, int high) {
if(high<=low) return;
int lt = low;
int i = low+1;
int gt = high;
int v = a[low];
while (i<=gt){
int comp = a[i] - v;
System.out.println(v + " " + a[low]);
if(comp<0) exch(a, lt++, i++);
else if(comp>0) exch(a,i,gt--);
else i++;
}
sort(a,low,lt-1);
sort(a,gt+1,high);
}
private static void exch(int[] a, int lg, int i) {
int temp = a[i];
a[i] = a[lg];
a[lg] = temp;
}
}
优先队列排序
利用优先队列进行排序,将所有元素传入一个查找最小元素的优先队列,然后重复调用删除最小元素的操作来将他们按顺序删去,就达到了排序的目的
在这重点掌握堆排序
class 堆 {
public static void main(String[] args) {
int n = 10;
int[] a = new int[n];
Random r = new Random();
for (int i = 0; i < n; i++) {
a[i] = r.nextInt(1000);
}
System.out.println(Arrays.toString(a));
sort(a);
System.out.println(Arrays.toString(a));
}
private static void sort(int[] a) {
int N = a.length-1;
System.out.println(Arrays.toString(a));
while (N > 0) {
exch(a, 0, N--);
sink(a, 0, N);
}
}
private static void exch(int[] a, int k, int i) {
int temp;
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
private static void sink(int[] a, int k, int n) {
while(2*k+1 <= n){
int j = 2*k+1;
if(j< n && a[j]<a[j+1]) j++;
if (!(a[k] < a[j])) break;
exch(a, k, j);
k = j;
}
}
}
class 上浮下沉{
private static void swim(int k){
int a[] = {};
int j = k / 2;
while(k>1 && a[k]>a[j]){
exch(a,k,j);
}
}
private static void sink(int k,int N){
int a[] = {};
while (2*k<=N){
int j = 2*k;
if(j<N && a[j]<a[j+1]) j++;
if(a[k]<a[j]) break;
exch(a,k,j);
k = j;
}
}
private static void exch(int[] a, int k, int j) {
int temp = a[k];
a[k] = a[j];
a[j] = temp;
}
}