数组排序学习

几种常见排序方法学习记录

1 交换两个元素

private static void swap(int[] array, int i, int j) {
		if (i != j) {
			array[i] = array[i] + array[j];
			array[j] = array[i] - array[j];
			array[i] = array[i] - array[j];
		}
	}

2.冒泡排序

public static void bubbleSort(int[] array) {
		int length = array.length;
		for (int i = 0; i < length; i++) {
			for (int j = i + 1; j < length; j++) {
				if (array[i] > array[j]) {
					swap(array, i, j);
				}
			}
		}
	}

3.选择排序

public static void selectSort(int[] array) {
		int length = array.length;
		for (int i = 0; i < length; i++) {
			int index = i;
			for (int j = i + 1; j < length; j++) {
				if (array[j] < array[index]) {
					index = j;
				}
			}
			if (i != index) {
				swap(array, i, index);
			}
		}
	}

4.插入排序

public static void insertSort(int[] array) {
		int length = array.length;
		for (int i = 1; i < length; i++) {
			int key = array[i];
			int position = i;
			for (int j = i - 1; j >= 0; j--) {
				if (array[j] > key) {
					array[j + 1] = array[j];
					position--;
				} else {
					break;
				}
			}
			array[position] = key;
		}
	}

5.快速排序

public static void quickSort(int[] array, int start, int end) {
		if (start < end) {
			int key = array[start];
			int i = start;
			for (int j = start + 1; j <= end; j++) {
				if (key > array[j]) {
					swap(array, j, ++i);
				}
			}
			array[start] = array[i];
			array[i] = key;
			quickSort(array, start, i - 1);
			quickSort(array, i + 1, end);
		}
	}

6.归并排序

public static void mergeSort(int[] array, int left, int right) {
		if (left < right) {
			int center = (left + right) >> 1;
			mergeSort(array, left, center);
			mergeSort(array, center + 1, right);
			merge(array, left, center, right);
		}
	}

	private static void merge(int[] array, int left, int center, int right) {
		int length = right - left + 1;
		int[] temp = new int[length];
		int temIndex = 0;
		int _left = left;
		int _right = center + 1;
		while (_left <= center && _right <= right) {
			if (array[_left] <= array[_right]) {
				temp[temIndex++] = array[_left++];
			} else {
				temp[temIndex++] = array[_right++];
			}
		}
		while (_right <= right) {
			temp[temIndex++] = array[_right++];
		}
		while (_left <= center) {
			temp[temIndex++] = array[_left++];
		}
		temIndex = 0;
		while (temIndex < length) {
			array[left + temIndex] = temp[temIndex++];
		}
	}

7.堆排序

public static void maxHeapFy(int[] array, int i, int heapSize) {
		int left = i * 2 + 1;
		int right = i * 2 + 2;
		int largest = i;
		if (left < heapSize && array[left] > array[largest]) {
			largest = left;
		}
		if (right < heapSize && array[right] > array[largest]) {
			largest = right;
		}
		if (largest != i) {
			swap(array, largest, i);
			maxHeapFy(array, largest, heapSize);
		}
	}

	public static void buildMaxHeap(int[] array,int heapSize){
		for(int i=(heapSize-2)>>1;i>=0;i--){
			maxHeapFy(array, i, heapSize);
		}
	}

	public static void heapSort(int[] array) {
		int length = array.length;
		buildMaxHeap(array, length);
		for (int i = 0; i < length; i++) {
			swap(array, 0, length - 1 - i);
			maxHeapFy(array, 0, length - i - 1);
		}
	}

8.二分查找

public static int binarySearch(int[] array, int key) {
		int low = 0;
		int high = array.length - 1;
		while (low <= high) {
			int middle = low + ((high - low) >> 1);
			if (key == array[middle]) {
				return middle;
			}
			if (key > array[middle]) {
				low = middle + 1;
			} else {
				high = middle - 1;
			}
		}
		return -1;
	}

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值