数据结构与算法

今天重温了以前学过的几种排序,现总结如下:

冒泡排序:

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) {
	    	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]+", ");
			}
		}
	}
}
 

 

你可能感兴趣的:(数据结构,算法)