/**
* 冒泡排序
* 每次比较计算出最大的值 放在数组的末尾
* 优化: 当一次循环没有 数据的交换的时候 就说明当前数组已经是有序的了
*/
public void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;
for (int j = 0; j < arr.length - i - 1; j++) {
//不等 是一个稳定的排序 相同的话不需要交换位置
if (arr[j] < arr[j + 1]) {
swap(arr, j, j + 1);
flag = false;
}
}
if (flag) break;
}
}
2. 插入排序
/**
* 有序序列 和 无序序列
*
* @param arr
*/
public void insertSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int j = i + 1;
int temp = arr[j];
//不等 是一个稳定的排序 相同的话不需要交换位置
while (j > 0 && temp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = temp;
}
}
3. 选择排序
publicvoidselectSort(int[] arr){for(int i =0; i < arr.length -1; i++){int min = arr[i];for(int j = i +1; j < arr.length; j++){if(arr[j]< min){
min = arr[j];}}
arr[i]= min;}}
4.快速排序
public void quickSort(int[] arr, int start, int end) {
if (start >= end) return;
int p = partition(arr, start, end);
quickSort(arr, start, p);
quickSort(arr, p + 1, end);
}
private int partition(int[] arr, int start, int end) {
int temp = arr[end];
int j = start;
for (int i = j; i < end; i++) {
if (arr[i] < temp) {
if (i != j) {
int a = arr[j];
arr[j] = arr[i];
arr[i] = a;
}
j++;
}
}
arr[end] = arr[j];
arr[j] = temp;
return j;
}
5.归并排序
public void mergeSort(int[] arr, int start, int end) {
if (start >= end) return;
int mid = (start + end) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
private void merge(int[] arr, int start, int mid, int end) {
int[] arr2 = new int[end - start + 1];
int count = 0;
int i = start;
int j = mid + 1;
while (i <= mid && j <= end) {
if (arr[i] < arr[j]) {
arr2[count++] = arr[i++];
} else {
arr[count++] = arr[j++];
}
}
int start1 = i;
int end1 = mid;
if (i > mid) {
start1 = j;
end1 = end;
}
while (start1 <= end1) {
arr2[count++] = arr[start1++];
}
while (start <= end) {
arr[start++] = arr2[count++];
}
}
private void swap(int[] arr, int j, int i) {
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
}