排序算法

稳定性比较

    稳定:插入排序、冒泡排序、二叉树排序、二路归并排序

    不稳定:选择排序、希尔排序、快速排序、堆排序

时间复杂性比较

    插入排序、冒泡排序、选择排序为O(n^2)

    其它为O(nlog2n)

1.

/*
	 * 题目:对10个数进行排序
	 */
	// 冒泡排序
	// 已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。
	// 再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值。
	// 这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。
	// 再对a[1]~a[n-2]以相同方法处理一轮,以此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。降序排列与升序排列相类似,
	// 若a[1]小于a[2]则交换两者的值,否则不变,后面以此类推。
	// 总的来讲,每一轮排序后最大(或最小)的数将移动到数据序列的最后,理论上总共要进行n(n-1)/2次交换。
	public static void print32(int[] nums) {
		System.out.println("冒泡排序");
		System.out.println("原数组" + Arrays.toString(nums));
		long start = System.currentTimeMillis();
		int len = nums.length;
		int count = 0;
		int count2 = 0;
		int count3 = 0;
		for (int i = len - 1; i > 0; i--) {
			for (int j = 0; j < i; j++) {
				count2++;
				if (nums[j] > nums[j + 1]) {
					count3++;
					int temp = nums[j];
					nums[j] = nums[j + 1];
					nums[j + 1] = temp;
				}
			}
			System.out.println("第" + (++count) + "次" + Arrays.toString(nums));
		}
		long end = System.currentTimeMillis();
		System.out.println("用时" + (end - start) + "毫秒,循环" + count2 + "次,交换" + count3 + "次");
	}

	/*
	 * 题目:对10个数进行排序
	 */
	// 选择排序
	// 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前(或最后),直到全部待排序的数据元素排完。
	// 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,
	// 使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
	public static void print33(int[] nums) {
		System.out.println("选择排序");
		System.out.println("原数组" + Arrays.toString(nums));
		long start = System.currentTimeMillis();
		int len = nums.length;
		int count = 0;
		int count2 = 0;
		int count3 = 0;
		int count4 = 0;
		for (int i = 0; i < len; i++) {
			int index = i;
			for (int j = i + 1; j < len; j++) {
				count2++;
				if (nums[index] > nums[j]) {
					count3++;
					index = j;
				}
			}
			if (index != i) {
				count4++;
				int temp = nums[i];
				nums[i] = nums[index];
				nums[index] = temp;
			}
			System.out.println("第" + (++count) + "次" + Arrays.toString(nums));
		}
		long end = System.currentTimeMillis();
		System.out.println("用时" + (end - start) + "毫秒,循环" + count2 + "次,交换下标" + count3 + "次,交换" + count4 + "次");
	}

	/*
	 * 题目:对10个数进行排序
	 */
	// 插入排序
	// ⒈ 从第一个元素开始,该元素可以认为已经被排序
	// ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
	// ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
	// ⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
	// ⒌ 将新元素插入到下一位置中
	// ⒍ 重复步骤2
	public static void print34(int[] nums) {
		System.out.println("插入排序");
		System.out.println("原数组" + Arrays.toString(nums));
		long start = System.currentTimeMillis();
		int len = nums.length;
		int count = 0;
		int count2 = 0;
		int count3 = 0;
		for (int i = 1; i < len; i++) {
			int index = i;
			int data = nums[index];
			count2++;
			while (index > 0 && (nums[index - 1] > data)) {
				count2++;
				count3++;
				nums[index] = nums[index - 1];
				index--;
			}
			nums[index] = data;
			System.out.println("第" + (++count) + "次" + Arrays.toString(nums));
		}
		long end = System.currentTimeMillis();
		System.out.println("用时" + (end - start) + "毫秒,循环" + count2 + "次,交换" + count3 + "次");
	}

	/*
	 * 题目:对10个数进行排序(选择排序)
	 */
	public static void print39(int[] nums) {
		System.out.print("数组" + Arrays.toString(nums));
		long start = System.currentTimeMillis();
		int len = nums.length;
		int count = 0;
		int count2 = 0;
		for (int i = 0; i < len - 1; i++) {
			for (int j = i + 1; j < len; j++) {
				count++;
				if (nums[i] > nums[j]) {
					count2++;
					int temp = nums[i];
					nums[i] = nums[j];
					nums[j] = temp;
				}
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("排序后为" + Arrays.toString(nums) + ",用时" + (end - start) + "毫秒,循环" + count + "次,交换" + count2 + "次");
	}

	public static void main(String[] args) {
		int[] nums = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
		int[] nums2 = { 10, 1, 9, 2, 8, 3, 7, 4, 6, 5 };
		T2.print32(nums.clone());
		System.out.println("----------------------------------------");
		T2.print33(nums.clone());
		System.out.println("----------------------------------------");
		T2.print34(nums.clone());
		System.out.println("----------------------------------------");
		System.out.println("----------------------------------------");
		T2.print32(nums2.clone());
		System.out.println("----------------------------------------");
		T2.print33(nums2.clone());
		System.out.println("----------------------------------------");
		T2.print34(nums2.clone());
	}

 输出:

冒泡排序
原数组[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
第1次[9, 8, 7, 6, 5, 4, 3, 2, 1, 10]
第2次[8, 7, 6, 5, 4, 3, 2, 1, 9, 10]
第3次[7, 6, 5, 4, 3, 2, 1, 8, 9, 10]
第4次[6, 5, 4, 3, 2, 1, 7, 8, 9, 10]
第5次[5, 4, 3, 2, 1, 6, 7, 8, 9, 10]
第6次[4, 3, 2, 1, 5, 6, 7, 8, 9, 10]
第7次[3, 2, 1, 4, 5, 6, 7, 8, 9, 10]
第8次[2, 1, 3, 4, 5, 6, 7, 8, 9, 10]
第9次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
用时0毫秒,循环45次,交换45次
----------------------------------------
选择排序
原数组[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
第1次[1, 9, 8, 7, 6, 5, 4, 3, 2, 10]
第2次[1, 2, 8, 7, 6, 5, 4, 3, 9, 10]
第3次[1, 2, 3, 7, 6, 5, 4, 8, 9, 10]
第4次[1, 2, 3, 4, 6, 5, 7, 8, 9, 10]
第5次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第6次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第7次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第8次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第9次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第10次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
用时0毫秒,循环45次,交换下标25次,交换5次
----------------------------------------
插入排序
原数组[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
第1次[9, 10, 8, 7, 6, 5, 4, 3, 2, 1]
第2次[8, 9, 10, 7, 6, 5, 4, 3, 2, 1]
第3次[7, 8, 9, 10, 6, 5, 4, 3, 2, 1]
第4次[6, 7, 8, 9, 10, 5, 4, 3, 2, 1]
第5次[5, 6, 7, 8, 9, 10, 4, 3, 2, 1]
第6次[4, 5, 6, 7, 8, 9, 10, 3, 2, 1]
第7次[3, 4, 5, 6, 7, 8, 9, 10, 2, 1]
第8次[2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
第9次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
用时0毫秒,循环54次,交换45次
----------------------------------------
----------------------------------------
冒泡排序
原数组[10, 1, 9, 2, 8, 3, 7, 4, 6, 5]
第1次[1, 9, 2, 8, 3, 7, 4, 6, 5, 10]
第2次[1, 2, 8, 3, 7, 4, 6, 5, 9, 10]
第3次[1, 2, 3, 7, 4, 6, 5, 8, 9, 10]
第4次[1, 2, 3, 4, 6, 5, 7, 8, 9, 10]
第5次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第6次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第7次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第8次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第9次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
用时0毫秒,循环45次,交换25次
----------------------------------------
选择排序
原数组[10, 1, 9, 2, 8, 3, 7, 4, 6, 5]
第1次[1, 10, 9, 2, 8, 3, 7, 4, 6, 5]
第2次[1, 2, 9, 10, 8, 3, 7, 4, 6, 5]
第3次[1, 2, 3, 10, 8, 9, 7, 4, 6, 5]
第4次[1, 2, 3, 4, 8, 9, 7, 10, 6, 5]
第5次[1, 2, 3, 4, 5, 9, 7, 10, 6, 8]
第6次[1, 2, 3, 4, 5, 6, 7, 10, 9, 8]
第7次[1, 2, 3, 4, 5, 6, 7, 10, 9, 8]
第8次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第9次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
第10次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
用时1毫秒,循环45次,交换下标15次,交换7次
----------------------------------------
插入排序
原数组[10, 1, 9, 2, 8, 3, 7, 4, 6, 5]
第1次[1, 10, 9, 2, 8, 3, 7, 4, 6, 5]
第2次[1, 9, 10, 2, 8, 3, 7, 4, 6, 5]
第3次[1, 2, 9, 10, 8, 3, 7, 4, 6, 5]
第4次[1, 2, 8, 9, 10, 3, 7, 4, 6, 5]
第5次[1, 2, 3, 8, 9, 10, 7, 4, 6, 5]
第6次[1, 2, 3, 7, 8, 9, 10, 4, 6, 5]
第7次[1, 2, 3, 4, 7, 8, 9, 10, 6, 5]
第8次[1, 2, 3, 4, 6, 7, 8, 9, 10, 5]
第9次[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
用时0毫秒,循环34次,交换25次

 

你可能感兴趣的:(排序算法)