您的位置:首页 > 其它

排序算法

2016-08-11 10:51 393 查看

1.交换排序

冒泡排序

package 排序算法;

import java.util.Arrays;

public class 冒泡排序算法 {

public static void main(String[] args) {
int[] a = { -10, 21, 20, 38, 27, 1, 3, 6, 3, 1 };
System.out.println(Arrays.toString(a));
bubbleSort(a);
System.out.println(Arrays.toString(a));
}

public static void bubbleSort(int[] a) {
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[i] > a[j]) {
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
}
}
}

}


快速排序1

package 排序算法;

import java.util.Arrays;

public class 快速排序算法 {

public static void main(String[] args) {
int[] a = { 5, 6, 4, 6, 3, 5, 2, 7, 1 };
System.out.println(Arrays.toString(a));
quickSort(a);
System.out.println(Arrays.toString(a));
}

public static int partition(int[] a, int l, int r) {
int i = l, j = r, x = a[l];
while (i < j) {
while (i < j && a[j] > x)
j--;
if (i < j)
a[i++] = a[j];
while (i < j && a[i] < x)
i++;
if (i < j)
a[j--] = a[i];
}
a[i] = x;
return i;
}

public static void quick_sort(int[] a, int l, int r) {
if (l < r) {
int i = partition(a, l, r);
quick_sort(a, l, i - 1);
quick_sort(a, i + 1, r);
}
}

public static void quickSort(int[] a) {
if (a.length > 0)
quick_sort(a, 0, a.length - 1);
}
}


快速排序2

package 排序算法;

import java.util.Arrays;

public class 快速排序算法2 {

public static void main(String[] args) {
int[] a = { 5, 6, 4, 1, 6, 3, 5, 2, 7, 1 };
System.out.println(Arrays.toString(a));
quickSort(a);
System.out.println(Arrays.toString(a));
}

public static void quick_sort(int[] a, int l, int r) {
int i = l, j = r;
if (l < r) {
int x = a[l];
while (i != j) {
while (i < j && a[j] > x)
j--;
if (i < j)
a[i++] = a[j];
while (i < j && a[i] < x)
i++;
if (i < j)
a[j--] = a[i];
}
a[i] = x;
quick_sort(a, l, i - 1);
quick_sort(a, i + 1, r);
}
}

public static void quickSort(int[] a) {
if (a.length > 0)
quick_sort(a, 0, a.length - 1);
}

}


奇偶排序

package 排序算法;

import java.util.Arrays;

public class 奇偶排序算法 {

public static void main(String[] args) {
int[] a = { 9, 1, 5, 3, 4, 2, 6, 8, 7, 1, 5 };
System.out.println(Arrays.toString(a));
odd_even_sort(a);
System.out.println(Arrays.toString(a));
}

private static void odd_even_sort(int[] a) {
boolean flag = false;
while (!flag) {
// 循环结束条件
flag = true;
// 奇偶位控制
for (int odd_even = 0; odd_even < 2; odd_even++)
// 所有的奇数位||所有的偶数位
for (int i = odd_even; i < a.length - 1; i += 2)
// 所有奇数位和邻居比较
if (a[i] > a[i + 1]) {
swap(a, i, i + 1);
// 循环继续条件
flag = false;
}
}
}

private static void swap(int[] a, int i, int j) {
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}

}


鸡尾酒排序

package 排序算法;

import java.util.Arrays;

public class 鸡尾酒排序算法 {

public static void main(String[] args) {
int[] a = { 5, 6, 4, 6, 3, 5, 2, 7, 1 };
System.out.println(Arrays.toString(a));
cooktail_sort(a);
System.out.println(Arrays.toString(a));
}

public static void cooktail_sort(int[] a) {
int l = 0, r = a.length - 1;
while (l < r) {
for (int i = l; i < r; i++) {
if (a[i] > a[i + 1])
swap(a, i, i + 1);
}
r--;
for (int j = r; j >= l; j--) {
if (a[j] > a[j + 1])
swap(a, j, j + 1);
}
l++;
}
}

public static void swap(int[] a, int i, int j) {
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}

}


2.选择排序

直接选择排序

package 排序算法;

import java.util.Arrays;

public class 选择排序算法 {

public static void main(String[] args) {
int[] a = { 5, 6, 4, 6, 3, 5, 2, 7, 1 };
System.out.println(Arrays.toString(a));
selection_sort(a);
System.out.println(Arrays.toString(a));
}

public static void selection_sort(int[] a) {
for (int i = 0; i < a.length - 1; i++) {
int min = i;
for (int j = i + 1; j < a.length; j++) {
if (a[min] >= a[j])
min = j;
}
if (min != i)
swap(a, min, i);
}
}

public static void swap(int[] a, int i, int j) {
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
}


3.插入排序

直接插入排序

package 排序算法;

import java.util.Arrays;

public class 直接插入排序算法 {

public static void main(String[] args) {
int[] a = { 6, 4, 7, 4, 73, 8, 23 };
System.out.println(Arrays.toString(a));
insertSort(a);
System.out.println(Arrays.toString(a));
}

public static void insertSort(int[] a) {
for (int i = 1; i < a.length; i++) {
if (a[i] < a[i - 1]) {
int x = a[i], k = i - 1;
for (int j = k; j >= 0 && a[j] > x; j--) {
a[j + 1] = a[j];
k--;
}
a[k + 1] = x;
}
}
}
}


希尔排序1

package 排序算法;

import java.util.Arrays;

public class 希尔排序算法 {

public static void main(String[] args) {
int[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8 };
System.out.println(Arrays.toString(a));
shell_sort(a);
System.out.println(Arrays.toString(a));
}

public static void shell_sort(int[] a) {
// 分组
for (int g = a.length / 2; g > 0; g /= 2) {
// 对每个组进行操作
for (int i = 0; i < g; i++) {
// 组内操作,相当于直接插入排序的外层循环
for (int j = i + g; j < a.length; j += g) {
// 相邻的比较
if (a[j] < a[j - g]) {
int x = a[j];
int k = j - g;
while (k >= 0 && a[k] > x) {
a[k + g] = a[k];
k -= g;
}
a[k + g] = x;
}
} // 组内操作
} // 组内
} // 分组
}

}


希尔排序2

package 排序算法;

import java.util.Arrays;

public class 希尔排序算法2 {

public static void main(String[] args) {
int[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8, 5, 3, 7, 3, 7 };
System.out.println(Arrays.toString(a));
shell_sort(a);
System.out.println(Arrays.toString(a));
}

public static void shell_sort(int[] a) {
for (int g = a.length / 2; g > 0; g /= 2) {
for (int j = g; j < a.length; j++) {
if (a[j] < a[j - g]) {
int x = a[j], k = j - g;
while (k >= 0 && a[k] > x) {
a[k + g] = a[k];
k -= g;
}
a[k + g] = x;
}
}
}
}

}


希尔排序3

package 排序算法;

import java.util.Arrays;

public class 希尔排序算法3 {

public static void main(String[] args) {
int[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8, 5, 3, 7, 3, 7 };
System.out.println(Arrays.toString(a));
shell_sort(a);
System.out.println(Arrays.toString(a));
}

public static void shell_sort(int[] a) {
for (int g = a.length / 2; g > 0; g /= 2)
for (int i = g; i < a.length; i++)
for (int j = i - g; j >= 0 && a[j] > a[j + g]; j -= g)
swap(a, j, j + g);
}

public static void swap(int[] a, int i, int j) {
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
}


4.归并排序

数组归并

package 排序算法;

import java.util.Arrays;

public class 归并数组 {

public static void main(String[] args) {
int[] a = { 5, 4, 3, 2, 1 };
int[] b = { 12, 11, 10, 9, 8, 7, 6 };
int[] c = new int[12];
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
merge_array(a, b, c);
System.out.println(Arrays.toString(c));
}

private static void merge_array(int[] a, int[] b, int[] c) {
int i, j, k;
i = j = k = 0;

while (i < a.length && j < b.length) {
if (a[i] < b[j])
c[k++] = a[i++];
else
c[k++] = b[j++];
}

while (i < a.length)
c[k++] = a[i++];
while (j < b.length)
c[k++] = b[j++];
}

}


归并排序

package 默写排序算法;

import java.util.Arrays;

public class 归并排序算法 {

public static void main(String[] args) {
int[] a = { 6, 7, 8, 5, 2, 34, 7, 3, 7, 23, 6, 2, 2 };
System.out.println(Arrays.toString(a));
merge_sort(a);
System.out.println(Arrays.toString(a));
}

private static void merge(int[] a, int l, int m, int r) {
int i = l, j = m + 1, k = 0;
int[] x = new int[r - l + 1];

while (i <= m && j <= r) {
if (a[i] <= a[j])
x[k++] = a[i++];
else
x[k++] = a[j++];
}

while (i <= m)
x[k++] = a[i++];
while (j <= r)
x[k++] = a[j++];

for (k = 0, i = l; i <= r; i++, k++)
a[i] = x[k];
}

public static void merge_gap(int[] a, int g) {
int i = 0;

for (i = 0; i + 2 * g - 1 < a.length; i += 2 * g)
merge(a, i, i + g - 1, i + 2 * g - 1);

if (i + g - 1 < a.length)
merge(a, i, i + g - 1, a.length - 1);
}

private static void merge_sort(int[] a) {
for (int g = 1; g < a.length; g *= 2)
merge_gap(a, g);
}
}


5.java自带排序API

package 排序算法;

import java.util.Arrays;

public class Java自带的排序api {

public static void main(String[] args) {
Integer[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8, 5, 3, 7, 3, 7 };
System.out.println(Arrays.toString(a));
Arrays.sort(a);
System.out.println(Arrays.toString(a));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: