老生常谈-----排序

这年头你要是不会几种排序算法,都不好意思说自己是搞编程的…
言归正传

PS:通往罗马的路不止一条,方法不唯一。

1.冒泡排序

原理

升序 :第i个元素与第i+1个元素比较,如果第i个元素比第i+1个,则交换他们的位置。接着继续比较第i+1个与第i+2个元素,如果第i+1个比第i+2个大,则交换他们的位置….直到最后一个元素
这样一趟比较交换下来之后,排在最右的元素就会是最的数。
除去队列最右边的元素,我们对剩余的元素做同样的操作,直到排序完成。共执行n-1趟(n为元素的个数)

降序:原理与升序相同,将升序原理中的黄色字体“大”变为”小“即可。

PS:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次

示例代码(java语言)

static int[] BubbleSort(int arr[]) {
		// 数组为空、长度为1并不需要排序
		if (arr == null || arr.length < 2) {
			return arr;
		}
		/*
		 * 一共n-1趟
		 * 
		 * i躺比较n-i次
		 */
		for (int i = 0; i < arr.length; i++) {
			/*
			 * 改善冒泡排序
			 * 
			 * 当某一趟遍历后,数并无交换时,则认为排序完成,不必继续冗余操作(break)
			 */
			boolean overFlag = true;// 结束循环符号
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j + 1] < arr[j]) {
					overFlag = false;// 有数进行交换,则不结束循环
					int temp = arr[j];// temp为交换临时数
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			// 一趟下来是否发生位置交换、不交换则排序完成
			if (overFlag)
				break;
		}
		return arr;
	}

2.插入排序

原理

升序和降序与冒泡排序类似,不加说明
从队列第2个元素开始,与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边。
继续选取第3,4,….n个元素,重复上述步骤 ,插入所在位置。

示例代码(java语言)

static int[] insertSort(int[] arr) {
		// 数组为空、长度为1并不需要排序
		if (arr == null || arr.length < 2) {
			return arr;
		}
		/*
		 * 从第二个元素开始,找到那个不大于自己的元素,插在其后面。
		 */

		for (int i = 1; i < arr.length; i++) {
			int temp = arr[i];// 当前元素
			int k = i - 1;// k代表当前元素左边的元素

			/*
			 * 左边的的元素存在且左边的元素大于自己,则比较下一个(左移)
			 */
			while (k >= 0 && arr[k] > temp) {
				k--;// 左移
			}
			/*
			 * 此时的k就是不大于自己的元素的位置
			 */
			// 位置k右边的元素向右移动一位,让当前元素插进k+1的位置;
			for (int j = i; j > k + 1; j--) {
				arr[j] = arr[j - 1];// 位置k右边的元素向右移动一位
			}
			// 插到属于自己的位置,位置k的右边
			arr[k + 1] = temp;
		}
		return arr;
	}

完整源代码

package test.sort;
import java.util.Arrays;
import java.util.Random;

public class Sort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = new int[10];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = new Random().nextInt(100) + 1;// 1到100之间的随机数
		}
		System.out.println("原数组:" + Arrays.toString(arr));
		System.out.println("冒泡排序后的数组:" + Arrays.toString(insertSort(arr)));
//		System.out.println("冒泡排序后的数组:" + Arrays.toString(BubbleSort(arr)));
	}

	static int[] BubbleSort(int arr[]) {
		// 数组为空、长度为1并不需要排序
		if (arr == null || arr.length < 2) {
			return arr;
		}
		/*
		 * 一共n-1趟
		 * 
		 * i躺比较n-i次
		 */
		for (int i = 0; i < arr.length; i++) {
			/*
			 * 改善冒泡排序
			 * 
			 * 当某一趟遍历后,数并无交换时,则认为排序完成,不必继续冗余操作(break)
			 */
			boolean overFlag = true;// 结束循环符号
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j + 1] < arr[j]) {
					overFlag = false;// 有数进行交换,则不结束循环
					int temp = arr[j];// temp为交换临时数
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			// 一趟下来是否发生位置交换、不交换则排序完成
			if (overFlag)
				break;
		}
		return arr;
	}

	static int[] insertSort(int[] arr) {
		// 数组为空、长度为1并不需要排序
		if (arr == null || arr.length < 2) {
			return arr;
		}
		/*
		 * 从第二个元素开始,找到那个不大于自己的元素,插在其后面。
		 */

		for (int i = 1; i < arr.length; i++) {
			int temp = arr[i];// 当前元素
			int k = i - 1;// k代表当前元素左边的元素

			/*
			 * 左边的的元素存在且左边的元素大于自己,则比较下一个(左移)
			 */
			while (k >= 0 && arr[k] > temp) {
				k--;// 左移
			}
			/*
			 * 此时的k就是不大于自己的元素的位置
			 */
			// 位置k右边的元素向右移动一位,让当前元素插进k+1的位置;
			for (int j = i; j > k + 1; j--) {
				arr[j] = arr[j - 1];// 位置k右边的元素向右移动一位
			}
			// 插到属于自己的位置,位置k的右边
			arr[k + 1] = temp;
		}
		return arr;
	}

}

猜你喜欢

转载自blog.csdn.net/Mr_Qian_Ives/article/details/104275912