5种排序算法
冒泡排序
依次比较相数字,顺序错误就交换,直到没有相邻元素需要交换。
public static void main(String[] args) {
Random random = new Random();
int a[] = new int[10];
// 初始化一个数组
for (int i = 0; i < a.length; i++) {
a[i] = random.nextInt(100);
System.out.print(a[i] + " ");
}
for (int i = 0; i < a.length-1; i++) {
for (int j = 0; j < a.length-i-1; j++) {
if (a[j] > a[j+1]) { // 相邻数字比较排序
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
System.out.println();
for (int i = 0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
}
快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
public void sort(int arr[], int start, int end) {
if (start > end) {
return ;
}
int i = start;
int j = end;
int key = arr[i]; // 基准位
while (i < j) {
while (i < j && arr[j] > key) {
j--;
}
arr[i] = arr[j];
while (i < j && arr[i] < key) {
i++;
}
arr[j] = arr[i];
}
arr[i] = key;
sort(arr, start, i - 1);
sort(arr, i+1, end);
}
选择排序
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[i]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
插入排序
将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。
for (int i= 0; i <a.length; i++) {
for (int j = 0; j < i; j++) {
if (a[i] < a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
归并排序
先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
public static int[] sort(int[] a, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
sort(a, low, mid);
sort(a, mid + 1, high);
// 左右归并
merge(a, low, mid, high);
}
return a;
}
public static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int i = low;
int j = mid + 1;
int k = 0;
// 把较小的数先移到新数组中
while (i <= mid && j <= high) {
if (a[i] < a[j]) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
// 把左边剩余的数移入数组
while (i <= mid) {
temp[k++] = a[i++];
}
// 把右边边剩余的数移入数组
while (j <= high) {
temp[k++] = a[j++];
}
// 把新数组中的数覆盖nums数组
for (int x = 0; x < temp.length; x++) {
a[x + low] = temp[x];
}
}