【数组】之排序详解

先推荐一篇博客:Java的八大排序算法

【数组】之排序详解_第1张图片

说明:本案例中采用的都是从小到大的排序方式。

排序的概念:排序是将一群数据,依次按照指定的顺序进行排列的过程。排序是数据处理中一种很重要的运算,同时也是很常用的运算,一般数据处理的25%时间都在进行排序。简单的说,排序就是把一组记录(元素)按照某个域的值的递增(由小到大)或者递减(由大到小)的次序重新排列的过程。

排序的分类:

(1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序,包括:交换式排序法、选择式排序法以及插入式排序法

(2)外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序,包括:合并排序法直接合并排序法

一、交换式排序法

交换式排序法属于内部排序法,是运用数据值比较后,根据判断规则对数据位置进行交换,从而达到排序的目的。

交换式排序包括:冒泡排序法(Bubble Sort)快速排序法(Quick Sort)

1、冒泡排序法

基本思想:相邻两个元素进行比较,如果发现前一个数比后一个数大则交换位置。内循环结束一次,将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。当然也可以从后往前排。

特点:效率低、实现简单

public static void bubbleSort(int[] arr){
		//思想:相邻两个元素进行比较,如果满足条件就进行位置置换
		//内循环结束一次,将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。当然也可以从后往前排。
		int temp = 0;
		//外层循环决定走几趟,arr.length-1趟
		for(int i = 0; i < arr.length-1; i++){
			//内层循环,开始逐个比较,如果发现前一个数据比后一个数据大则交换
			for(int j = 0; j < arr.length-i-1; j++){
				if(arr[j] > arr[j+1]){
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		
		//将重新排序后的数组打印出来看看
		for(int k = 0; k < arr.length; k++){
			System.out.println(arr[k]);
		}
	}

2、快速排序法

是对冒泡排序的一种改进。

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数据变成有序序列。

特点:效率高,但是运行时比较占用CPU。

在此推荐一篇博客:快速排序的原理及其实现

public static void quickSort(int arr[], int low, int hight) {
	        int i, j, index;
	        if (low > hight) {
	            return;
	        }
	        i = low;
	        j = hight;
	        index = arr[i]; // 用子表的第一个记录做基准
	        while (i < j) { // 从表的两端交替向中间扫描
	            while (i < j && arr[j] >= index)
	                j--;
	            if (i < j)
	                arr[i++] = arr[j];// 用比基准小的记录替换低位记录
	            while (i < j && arr[i] < index)
	                i++;
	            if (i < j) // 用比基准大的记录替换高位记录
	                arr[j--] = arr[i];
	        }
	        arr[i] = index;// 将基准数值替换回 arr[i]
	        quickSort(arr, low, i - 1); // 对低子表进行递归排序
	        quickSort(arr, i + 1, hight); // 对高子表进行递归排序

            //将重新排序后的数组打印出来看看
		    for(int k = 0; k < arr.length; k++){
			    System.out.println(arr[k]);
		    }

	    }

二、选择式排序法

选择式排序法也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再根据原则交换位置后达到排序的目的。

选择式排序可以分为两种:选择排序法和堆排序法

1、选择排序法

思想:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]进行位置交换;第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]进行位置交换;......第n-1次从arr[n-2]~arr[n-1]中选取最小值与arr[n-2]进行位置交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

特点:效率低、实现简单。

public static void selectSort(int[] arr){
		//从第一个元素依次和其他元素进行比较,在内循环第一次结束,数组中的最小值出现在头角标位置上,然后再开始排第二个位置
		for(int i = 0; i < arr.length-1; i++){
			for(int j = i+1; j arr[j]){
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		
		//将重新排序后的数组打印出来看看
		for(int k = 0; k < arr.length; k++){
			System.out.println(arr[k]);
		}
		
	}

三、插入式排序法

插入排序法属于内部排序法,是对于欲排序的元素以插入的方式寻找该元素的适当位置,从而达到排序的目的。

插入式排序分为:插入排序法(Insertion  sort)、谢耳排序法(shell  sort)以及二叉树排序法(Binary-Tree  sort)

1、插入排序

基本思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的值依次与有序表中的值进行比较,将它插入到有序表中适当的位置,使之成为新的有序表。

public static void insertSort(int arr[]){
		for(int i = 1; i < arr.length; i++){
			int insertVal = arr[i];
			int index = i - 1;
			//insertVal和i之前的有序数组中的每一个数进行比较,找到自己的位置
			while(index >= 0 && insertVal < arr[index]){
				//将arr[index]向后移动一位
				arr[index+1] = arr[index];
				//让index向前移动一位
				index--;
			}
			//将insertVal插入合适的位置
			arr[index+1] = insertVal;
		}
		System.out.println(Arrays.toString(arr));
	}
}

 

你可能感兴趣的:(Java基础)