今天重温了以前学过的几种排序,现总结如下:
冒泡排序:
package com.goole.rank;
/**
* 冒泡排序(稳定,时间复杂度O(n*n),空间复杂度O(1))
* @author darren
*
*/
public class BubbleSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
bubbleSort(a);
print(a);
}
private static void bubbleSort(int[] a) {
for(int i=0; i<a.length-1; i++) {
boolean flag = false;
for(int j=a.length-1; j>i; j--) {
if(a[j]<a[j-1]) {
swap(a, j-1, j);
flag = true;
}
}
if(!flag) {
return;
}
}
}
private static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
}
直接插入排序:
package com.goole.rank;
/**
* 直接插入排序(稳定,时间复杂度O(n*n),空间复杂度O(1))
* @author darren
*
*/
public class InsertSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
insertsort(a);
print(a);
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
private static void insertsort(int[] a) {
for(int i=1; i<=a.length-1; i++) {
if(a[i]<a[i-1]) {
int p = a[i];
int j;
for(j=i-1; j>=0&&a[j]>p; j--) {
a[j+1] = a[j];
}
a[j+1] = p;
}
}
}
}
折半插入排序:
package com.goole.rank;
/**
* 折半插入排序(稳定,时间复杂度O(n*n),空间复杂度O(1))
* 和直接插入排序相比仅仅少了元素的比较次数
* @author darren
*
*/
public class HalfInsertSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
halfInsertSort(a);
print(a);
}
private static void halfInsertSort(int[] a) {
for(int i=1; i<=a.length-1; i++) {
if(a[i]<a[i-1]) {
int p = a[i];
int low=0, high=i-1;
while(low<=high) {
int mid = (low+high)/2;
if(p<a[mid]) {
high = mid-1;
}else {
low = mid+1;
}
}
int j=i-1;
for(; j>=high+1; j--) {
a[j+1] = a[j];
}
//a[j+1] = p;
a[high+1] = p;
}
}
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
}
归并排序:
package com.goole.rank;
/**
* 归并排序(稳定,时间复杂度O(n*log(n)),空间复杂度O(n))
* @author darren
*
*/
public class MergeSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
int[] tempArr = new int[a.length];
mergeSort(a, tempArr, 0, a.length-1);
print(a);
}
private static void mergeSort(int[] a, int[] tempArr, int low, int high) {
if(low<high) {
int mid = (low+high)/2;
mergeSort(a, tempArr, low, mid);
mergeSort(a, tempArr, mid+1, high);
merge(a, tempArr, low, mid+1, high);
}
}
private static void merge(int[] a, int[] tempArr, int leftPos, int rightPos, int rightEnd) {
int leftEnd = rightPos-1;
int tempPos = leftPos;
int num = rightEnd-leftPos+1;
while(leftPos<=leftEnd&&rightPos<=rightEnd) {
if(a[leftPos]<a[rightPos]) {
tempArr[tempPos++] = a[leftPos++];
}else {
tempArr[tempPos++] = a[rightPos++];
}
}
while(leftPos<=leftEnd) {
tempArr[tempPos++] = a[leftPos++];
}
while(rightPos<=rightEnd) {
tempArr[tempPos++] = a[rightPos++];
}
for(int i=0; i<num; i++,rightEnd--) {
a[rightEnd] = tempArr[rightEnd];
}
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
}
堆排序:
package com.goole.rank;
/**
* 堆排序(不稳定,时间复杂度O(nlog(n), 空间复杂度O(1))
* @author darren
*
*/
public class HeapSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
heapSort(a);
print(a);
}
private static void heapSort(int[] a) {
//建堆过程
for(int i=a.length/2; i>=0; i--) {
percDown(a, i, a.length);
}
//删除过程
for(int i=a.length-1; i>0; i--) {
swap(a, 0, i);
percDown(a, 0, i);
}
}
private static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void percDown(int[] a, int i, int n) {
int child = 0;
int temp;
for(temp=a[i]; leftChild(i)<n; i=child) {
child = leftChild(i);
if(leftChild(i)!=n-1&&a[child]<a[child+1]) {
child++;
}
if(temp<a[child]) {
a[i] = a[child];
}else {
break;
}
}
a[i] = temp;
}
private static int leftChild(int i) {
return 2*i+1;
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
}
快速排序:
package com.goole.rank;
/**
* 快速排序(不稳定,时间复杂度O(n*log(n)),空间复杂度O(log(n)))
* @author darren
*
*/
public class QuickSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
quickSort(a, 0, a.length-1);
print(a);
}
private static void quickSort(int[] a, int low, int high) {
if(low<high) {
int mid = getMiddle(a, low, high);
quickSort(a, 0, mid-1);
quickSort(a, mid+1, high);
}
}
private static int getMiddle(int[] a, int low, int high) {
int pivot = a[low];
while(low<high) {
while(a[high]>=pivot&&high>low) {
high--;
}
a[low] = a[high];
while(a[low]<=pivot&&high>low) {
low++;
}
a[high] = a[low];
}
a[low] = pivot;
return low;
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
}
简单选择排序:
package com.goole.rank;
/**
* 简单选择排序(不稳定,时间复杂度O(n*n),空间复杂度O(1))
* @author darren
*
*/
public class SelectSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
selectSort(a);
print(a);
}
private static void selectSort(int[] a) {
for(int i=0; i<a.length-1; i++) {
for(int j=i+1; j<=a.length-1; j++) {
if(a[j]<a[i]) {
swap(a, i, j);
}
}
}
}
private static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
}
希尔排序:
package com.goole.rank;
/**
* 希尔排序(不稳定,时间复杂度<O(n*n),空间复杂度O(1))
* @author darren
*
*/
public class ShellSort {
public static void main(String[] args) {
int[] a = {4, 8, 9, 3, 0, 5, 7, 6, 2};
shellSort(a);
print(a);
}
private static void shellSort(int[] a) {
for(int gap=a.length/2; gap>0; gap/=2) {
for(int i=gap; i<a.length; i++) {
int temp = a[i];
int j=i;
for(; j>=gap&&temp<a[j-gap]; j-=gap) {
a[j] = a[j-gap];
}
a[j] = temp;
}
}
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
if(i==a.length-1) {
System.out.print(a[i]);
}else {
System.out.print(a[i]+", ");
}
}
}
}