biGpython

生亦何欢,死亦何苦? 予我長袖,我必善舞!

导航

基础排序——冒泡排序、选择排序、插入排序的讲解、代码实现

选择排序:

这里有个视频非常清晰,用舞蹈的形式展现排序的过程。先拿出一个元素,通常是第一个元素arr[0]开始,与数组中他之后的紧挨着(+1)的那个元素开始挨个进行比较,如果遇到比arr[0] 大的,就交换元素,交换后,由新的元素(即新的值)按照当前的比较顺序比继续进行后面的较、交换操作。

然后第二个元素 、第三个元素 依次进行比较,交换。

注意:

  1. 第一个元素比较交换后(即第一次外层循环后),能确定出最小的元素,并且已经被交换到数组的第一个元素;
  2. 第二个元素比较交换后(即第一次外层循环后),能确定出倒数第二小的元素,并且已被交换到数组的第二个元素。
  3. 由于排出n-1个元素,最后一个就不需要排序了,所以外层的循环次数是arr.length-1

代码

	//准确写法 注意两次循环的长度
	public static void selectSort(int[] arr) {
		int temp = 0;
		int changeCount = 0;
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[i] > arr[j]) {
					temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
					changeCount++;
				}
			}
		}
		for (int i : arr) {
			System.out.print(i);
		}
		System.out.println("交换次数"+changeCount);
	}

冒泡排序

  就像石头沉入水底,石头上的灰尘会向上冒,直到浮出水面。每次都从第一个元素开始(比较次数很多),逐个与其他元素进行比较,如果大就交换元素(),所以每一次比较(每一次外层循环)就会确定一个最大值到数组最末尾,这样内层循环每次需要比较次数就会少一次。

外层循环的意义:每次确定一个最大值,也就决定了内存循环的比较次数

内层循环的意义:根据外层循环的i值(也就是排出了i个元素的序了,所以可以确定接下来的循环需要的比较次数为arr.length-1-i)。

  tips:

  1.排出N-1个元素,留下的就是最小(或最大)的元素。所以外层循环的次数是arr.length - 1

  2.外层每排好一个元素,内层需要比较的次数就少一次,所以内层循环的次数是arr.length - 1 - i

代码

	// 冒泡排序
	public static int[] maoPao(int[] ary2) {
		int changeCount = 0;
		for (int i = 0; i < ary2.length - 1; i++) { //每次冒泡一个,最后一个不需要冒泡,因此是length-1次
			for (int j = 0; j < ary2.length - i - 1; j++) {
				if (ary2[j] > ary2[j + 1]) { //与自身元素比较,比较次数多,交换次数多。
					int temp = ary2[j];
					ary2[j] = ary2[j + 1];
					ary2[j + 1] = temp;
					changeCount++;
				}
			}
		}
		System.out.println(changeCount);
		return ary2;
	}

插入排序

  拿一个元素(通常是第二个元素)插到一个元素之后,与其前所有元素挨个进行比较,若比其大就交换元素,直到前面没有比他大的。若果上来就比其小,就不交换,顺序是正确的。可以保证后面比较时,插入的位置前面的元素都是排好序的。也就是从前向后排序。

代码

	public static void main(String[] args) {
		int[] arr = new int[10];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int)(Math.random() * 10);
			System.out.print(arr[i] + ",");
		}
		for (int i = 1; i < arr.length; i++) {//从第二个元素向前插入
			int index = i;
			int temp = arr[i];
			
			while(index > 0 && arr[index -1] > temp){
				arr[index] = arr[index - 1];
				
				index--;
			}
			arr[index] = temp;
		}
		System.out.println();
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+ ",") ;
		}
	}

  

posted on 2012-06-28 23:34  biGpython  阅读(586)  评论(0编辑  收藏  举报