您的位置:首页 > 编程语言 > Java开发

JAVA实现常见简单排序算法

2016-09-08 22:30 507 查看

常见的简单排序算法的相关数据:

排序方法时间复杂度(无特殊说明都是指最差情况)空间复杂度稳定性
冒泡排序O(N^2)O(1)稳定
插入排序O(N^2)O(1)稳定
选择排序O(N^2)O(1)不稳定
希尔排序O(NlogN)O(1)不稳定
快速排序平均O(NlogN),最差O(N^2)O(NlogN)不稳定
归并排序O(NlogN)O(N)稳定
堆排序O(NlogN)O(1)不稳定
桶排序O(N)O(K)稳定
基数排序O(dN),d为常数O(N)稳定

部分排序算法的Java代码实现:

冒泡排序:

/**
* 冒泡
*
* @param arr
*/
public static void bubbleSort(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
*/
public static void selectSort(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
*/
public static void insertSort(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
*/
public static void binarySort(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
*/
public static void shellSort(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
*/
public static void quickSort(int arr[], int low, int high) {
if (arr == null)
throw new IllegalArgumentException("parameter arr can not be null");
if (low >= high)
return;
int i = low;
int j = high;
int pivot = arr[i];
// partition
while (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
*/
public static void mergeSort(int arr[], int low, int high) {
if (arr == null)
throw new 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);
}
}

private static void merge(int arr[], int start1, int end1, int start2, int end2) {
int i = start1;
int j = start2;
int k = 0;
int tmp[] = new int[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
*/
public static void heapSort(int arr[]) {
if (arr == null)
throw new 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);
}

}

private static void adjustHeap(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息