面试常用排序算法

public class SortAlgorithm {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SortAlgorithm sa = new SortAlgorithm();
		// int[] arr = {4,7,2,4,3,9,0,10};
		int[] arr = { 8, 5, 3, 6, 1, 9, 4, 3 };
		int len = arr.length;
		// sa.quickSort(arr, 0, len-1);
		// sa.heapSort(arr);
		// sa.bubbleSort1(arr);
		// sa.bubbleSort2(arr);
		// sa.selectSort(arr);
		// sa.quickSort(arr, 0, len-1);
		// sa.shellSort(arr);
		// sa.BSort(arr);
		sa.MergeSort(arr, 0, len - 1);
		sa.printArr(arr);
	}

	
	/*
	 * Quick Sort
	 */
	public void quickSort(int[] arr, int left, int right) {
		int index = partion(arr, left, right);
		if (left < index - 1) {
			quickSort(arr, left, index - 1);
		}

		if (index < right) {
			quickSort(arr, index, right);
		}
	}

	private int partion(int[] arr, int left, int right) {
		int pivot = arr[(left + right) / 2];
		while (left <= right) {
			while (arr[left] < pivot) {
				++left;
			}
			while (arr[right] > pivot) {
				--right;
			}
			if (left <= right) {
				int tmp = arr[left];
				arr[left] = arr[right];
				arr[right] = tmp;
				++left;
				--right;
			}
		}
		return left;
	}

	/*
	 * Quick Sort2
	 */
	public void quickSort2(int[] arr, int left, int right) {
		if (left >= right)
			return;
		int key = arr[left];
		int i = left;
		int j = right + 1;
		while (i < j) {
			++i;
			while (arr[i] < key) {
				++i;
			}

			--j;
			while (arr[j] > key) {
				--j;
			}

			if (i < j) {
				int tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
		}
		int tmp = arr[left];
		arr[left] = arr[j];
		arr[j] = tmp;
		quickSort2(arr, left, j - 1);
		quickSort2(arr, j + 1, right);
	}

	
	/*
	 * Heap Sort
	 */
	public void heapSort(int[] arr) {
		int len = arr.length;
		for (int i = len; i >= 1; --i) {
			buildHeap(arr, i);
			int tmp = arr[0];
			arr[0] = arr[i - 1];
			arr[i - 1] = tmp;
		}
	}

	private void buildHeap(int[] arr, int len) {
		for (int i = len; i >= 0; --i) {
			swap(arr, i, len);
		}
	}

	private void swap(int[] arr, int p, int len) {
		int maxt = p;
		int left = 2 * p + 1;
		if (left < len && arr[left] > arr[maxt]) {
			maxt = left;
		}

		int right = 2 * p + 2;
		if (right < len && arr[right] > arr[maxt]) {
			maxt = right;
		}

		if (maxt != p) {
			int tmp = arr[p];
			arr[p] = arr[maxt];
			arr[maxt] = tmp;
			swap(arr, maxt, len);
		}

	}

	
	/*
	 * Bubble Sort
	 */
	public void bubbleSort1(int[] arr) {
		int len = arr.length;
		int upperBound = len - 1;
		for (int i = 0; i < len; ++i) {
			int t = 0;
			for (int j = 0; j < len - i - 1 && j < upperBound; ++j) {
				if (arr[j] > arr[j + 1]) {
					t = j;
					swapTwo(arr, j, j + 1);
				}
			}
			upperBound = t;
		}
	}

	public void bubbleSort2(int[] arr) {
		int len = arr.length;
		int upperBound = len - 1;
		while (upperBound > 0) {
			int t = 0;
			for (int i = 0; i < upperBound; ++i) {
				if (arr[i] > arr[i + 1]) {
					t = i;
					swapTwo(arr, i, i + 1);
				}
			}
			upperBound = t;
		}
	}

	public void swapTwo(int[] arr, int left, int right) {
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
	}

	/*
	 * Select Sort
	 */

	public void selectSort(int[] arr) {
		int len = arr.length;
		for (int j = len - 1; j >= 1; --j) {
			int t = 0;
			for (int i = 1; i <= j; ++i) {
				if (arr[t] < arr[i]) {
					t = i;
				}
			}
			swapTwo(arr, t, j);
		}
	}

	
	/*
	 * Insert Sort
	 */
	public void insertSort(int[] arr) {
		int len = arr.length;
		for (int i = 1; i < len; ++i) {
			int t = arr[i];
			int j = i - 1;
			while (j >= 0 && arr[j] > t) {
				arr[j + 1] = arr[j];
				--j;
			}
			arr[j + 1] = t;
		}
	}

	
	/*
	 * Shell Sort
	 */
	public void shellSort(int[] arr) {
		int len = arr.length;
		int i = 0;
		int j = 0;
		for (int h = len / 2; h > 0; h /= 2) {
			for (i = h; i < len; ++i) {
				int tmp = arr[i];
				for (j = i - h; j >= 0; j -= h) {
					if (arr[j] > tmp) {
						arr[j + h] = arr[j];
					} else {
						break;
					}
				}
				arr[j + h] = tmp;
			}
		}
	}

	
	/*
	 * Merge Sort
	 */
	public void MergeSort(int[] arr, int left, int right) {
		if (left < right) {
			int mid = (left + right) / 2;
			MergeSort(arr, left, mid);
			MergeSort(arr, mid + 1, right);
			Merge(arr, left, mid, right);
		}

	}

	private void Merge(int[] arr, int left, int mid, int right) {
		int[] tmp = new int[arr.length];
		int p = left;
		int q = mid + 1;
		int index = left;
		while (p <= mid && q <= right) {
			if (arr[p] < arr[q]) {
				tmp[index++] = arr[p++];
			} else {
				tmp[index++] = arr[q++];
			}
		}

		while (p <= mid) {
			tmp[index++] = arr[p++];
		}

		while (q <= right) {
			tmp[index++] = arr[q++];
		}

		for (int i = left; i <= right; ++i) {
			arr[i] = tmp[i];
		}
	}

	public void swapArr(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	public void printArr(int[] arr) {
		int len = arr.length;
		for (int i = 0; i < len; ++i) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值