常见数组算法小解

以下数组皆采用 int[] arr = {30,45,23,24,89,20};

  1. 冒泡排序(相邻两个元素进行比较,每次选出一个最大值放在最后面)
for (int i = 0; i < arr.length - 1; i++) {
	// 每一轮都是从头开始两个元素进行比较 比较最大次数为每一轮 - 1 因为每次选出最大值后不再参与比较
	for (int j = 0; j < arr.length - i - 1; j++) {
		// 如果后者大于前者 则进行交换
		if (arr[j] > arr[j + 1]) {
			int t = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = t;
		}
	}
}

2.选择排序(每次选出一个最小值放在最前面,假设第一个是最小值依次与后面的数进行比较,如果碰到比假设最小值还小的数则进行交换,以此类推)

for (int i = 0; i < arr.length - 1; i++) {
	// 假设每一轮的第一个数为最小值
	int minIndex = i;
	// 假设的最小值与后面的元素一一比较
	for (int j = i + 1; j < arr.length; j++) {
		// 当碰到比第一个数还小的数 则交换最小值的下标
		if (arr[minIndex] > arr[j]) {
			minIndex = j;
		}
	}
	// 如果每一轮的最小值与假设的最小值不同 则交换两个数的位置
	if (minIndex != i) {
		int t = arr[i];
		arr[i] = arr[minIndex];
		arr[minIndex] = t;
	}
}

3.插入排序(每一轮都是从第二个元素开始 依次与前面元素进行比较 )

for (int i = 1; i < arr.length ; i++) {
	// 每一轮都是找第一个数作为基数
	int t = arr[i];
	// 从基数的前一个数开始进行比较
	int pos = i - 1;
	// 如果前面有数大于基数 则将前面的数赋值给基数的位置  直到小于基数停止此轮
	while (pos >= 0 && arr[pos] > t) {
		arr[pos + 1] = arr[pos];
		pos--;
	}
	arr[pos + 1] = t;
}

4.希尔排序(类似于优化版的插入排序)

int gap = arr.length;
while (true) {
	gap /= 2;
	// 每一轮进行一次插入排序
	for (int i = 0; i < gap; i++) {
		// 插入排序
		for (int j = i + gap; j < arr.length; j += gap) {
			int t = arr[j];
			int pos = j - gap;
			while (pos >= 0 && arr[pos] > t) {
				arr[pos + gap] = arr[pos];
				pos--;
			}
			arr[pos + gap] = t;
		}
	}
	if (gap == 1) {
		break;
	}
}

5.快速排序(采用递归分治的思想)

public static void quickSort(int[] arr, int start, int end) {
	int i = start;
	int j = end;
	int pivot = arr[start];
	while (i < j) {
		// 从后向前
		while (i < j && arr[j] > pivot) {
			j--;
		}
		arr[i] = arr[j];
		i++;
		// 从前向后
		while (i < j && arr[i] < pivot) {
			i++;
		}
		arr[j] = arr[i];
		j--;
		if (i - 1 > start) {
			quickSort(arr, start, i - 1);
		}
		if (j + 1 < end) {
			quickSort(arr, j + 1, end)
		}
	}

}

6.二分法查找

int start = 0;
int end = arr.length - 1;
while (start <= end) {
	int mid = (start + end) / 2;
	if (arr[mid] > key) {
		end = mid - 1;
	} else if (arr[mid] < key) {
		start = mid + 1;
	} else {
		return mid;
	}
}
return -1;

7.杨辉三角

int[][] arr = new int[7][];
for (int i = 0; i < arr.length; i++) {
	// 给每一行创建空间
	arr[i] = new int[i + 1];
	for (int j = 0; j < arr[i].length; j++) {
		if (i == j || j == 0) {
			arr[i][j] = 1;
		} else {
            arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
        }
        System.out.print(arr[i][j]+" ");
	}
	System.out.println();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值