/**
* 冒泡
*
* @param arr
*/publicstaticvoidbubbleSort(int arr[]) {
if (arr == null)
return;
int len = arr.length;
for (int i = len - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
}
选择排序:
/**
* 选择
* @param arr
*/publicstaticvoidselectSort(int arr[]) {
if (arr == null)
return;
int len = arr.length;
for (int i = 0; i < len - 1; i++) {
for (int j = i + 1; j < len; j++) {
if (arr[i] > arr[j])
swap(arr, i, j);
}
}
}
插入排序:
/**
* 插入
* @param arr
*/publicstaticvoidinsertSort(int arr[]) {
if (arr == null)
return;
int len = arr.length;
for (int i = 1; i < len; i++) {
for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
swap(arr, j, j - 1);
}
}
}
二分排序(属于插入排序的一种优化):
/**
* 二分
* @param arr
*/publicstaticvoidbinarySort(int arr[]) {
if (arr == null)
return;
int len = arr.length;
for (int i = 1; i < len; i++) {
int left = 0;
int right = i - 1;
int tmp = arr[i];
while (left <= right) {
int mid = (left + right) >>> 1;
if (arr[mid] > tmp) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
arr[left] = tmp;
}
}
希尔排序(实质是分组插入排序):
/**
* 希尔
* @param arr
*/publicstaticvoidshellSort(int arr[]) {
if (arr == null)
return;
int increment = arr.length;
int tmp = 0;
do {
increment = increment / 3 + 1;
for (int i = increment; i < len; i++) {
if (arr[i] < arr[i - increment]) {
tmp = arr[i];
int j = i - increment;
do {
arr[j + increment] = arr[j];
j = j - increment;
} while (j > 0 && arr[j] > tmp);
arr[j + increment] = tmp;
}
}
} while (increment > 1);
}
快速排序:
/**
* 快排
* @param arr
* @param low
* @param high
*/publicstaticvoidquickSort(int arr[], int low, int high) {
if (arr == null)
thrownew IllegalArgumentException("parameter arr can not be null");
if (low >= high)
return;
int i = low;
int j = high;
int pivot = arr[i];
// partitionwhile (i < j) {
while (i < j && arr[j] > pivot)
j--;
if (i < j)
arr[i++] = arr[j];
while (i < j && arr[i] <= pivot)
i++;
if (i < j)
arr[j--] = arr[i];
}
arr[j] = pivot;
quickSort(arr, low, j - 1);
quickSort(arr, j + 1, high);
}
归并排序:
/**
* 归并
* @param arr
* @param low
* @param high
*/publicstaticvoidmergeSort(int arr[], int low, int high) {
if (arr == null)
thrownew IllegalArgumentException("parameter arr can not be null");
if (low < high) {
int mid = (low + high) >>> 1;
mergeSort(arr, low, mid);
mergeSort(arr, mid + 1, high);
merge(arr, low, mid, mid + 1, high);
}
}
privatestaticvoidmerge(int arr[], int start1, int end1, int start2, int end2) {
int i = start1;
int j = start2;
int k = 0;
int tmp[] = newint[end2 - start1 + 1];
while (i <= end1 && j <= end2) {
if (arr[i] <= arr[j]) {
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i <= end1) {
tmp[k++] = arr[i++];
}
while (j <= end2) {
tmp[k++] = arr[j++];
}
// 复制到原数组中
k = start1;
for (; k <= end2; k++) {
arr[k] = tmp[k - start1];
}
}
堆排序:
/**
* 堆排序
* 升序创建大根堆,降序创建小根堆
* @param arr
*/publicstaticvoidheapSort(int arr[]) {
if (arr == null)
thrownew IllegalArgumentException("parameter arr can not be null");
//创建大根堆int len = arr.length;
for (int i = len / 2 - 1; i >= 0; i--) {
adjustHeap(arr, i, len);
}
for (int i = len - 1; i > 0; i--) {
swap(arr, i, 0);
adjustHeap(arr, 0, i);
}
}
privatestaticvoidadjustHeap(int arr[], int index, int n) {
int i = index;
int tmp = arr[i];
int j = 2 * i + 1;
while(j < n) {
if (j + 1 < n && arr[j + 1] > arr[j])
j++;
if (arr[j] <= tmp)
break;
arr[i] = arr[j];
i = j;
j = 2 * i + 1;
}
arr[i] = tmp;
}