内部排序:指将需要处理的所有的数据都加载到内部存储器中进行排序
外部排序:当数据量过大,无法全部加载到内存中,需要借助外部存储器进行排序
常见的算法分类:
5.1 冒泡排序
基本思想:通过对待排序从前往后(从下标小的元素开始),依次比较相邻的元素的值,如是发现逆序则交换,使值较大的元素逐渐从前移向后部,像水底的起跑一样。
总结规则:
一共进行n-1次大循环(数组中有n个元素)
每一次排序的元素在逐渐的减少
如果在某次排序的过程中,没有发生一次交换,说明排序已经完成了
public static int[] bubbleSort(int[] arr) { int temp = 0; boolean flag = false; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if(arr[j] > arr[j+1]){ flag = true; temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } if(!flag){ break; }else { flag = false; } } return arr; } 5.2 选择排序选择排序也是属于内部排序,是从要排序的数据中按照指定的规则挑选出某一元素,再依照规则交换位置达到排序的目的。
选择排序的思想:
从arr[0]--arr[n-1]中找到最小的数值,然后交换arr[0]和最小值交换位置
从arr[1]--arr[n-1]中找到最小的数值,然后交换arr[1]和最小值交换位置
........
直到所有的数据进行交换完成
// 选择排序,选择数组中的最小的元素与arr[0]进行交换,然后继续在剩下的位置寻找次最小值与arr[1]交换,直到将所有的数据排序完成 public static int[] selectSort(int[] arr){ int temp = 0; int index = 0; for (int i = 0; i < arr.length-1; i++) { index = i; // 初始最小值的索引为i for (int j = i+1; j < arr.length; j++) { //如果arr[j]小于arr[index],则j为最小值的索引 if(arr[j] < arr[index]){ index = j; } } // 交换最小值和arr[i]的位置 temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; } return arr; } 5.3 插入排序插入排序属于内部排序法,是对于欲排序的元素以插入的方式寻找该元素的适当位置。
插入排序的思想:把n个待排序的元素看做是一个有序表和无序表,开始时有序表中只含有一个元素,无序表中包含n-1个元素。排序的过程中,每次从无序表中取出第一个元素,把它插入到有序表中的适当位置,使之形成新的有序表。
代码的实现:
/** * 插入排序,将列表看做一个有序表和一个无序表 * @param arr * @return */ public static int[] insertSort(int[] arr){ int temp = 0; int index = 0; for (int i = 1; i < arr.length; i++) { temp = arr[i]; index = i-1; // 倒叙判断从i-1到0进行判断,如果出现temp>arr[index],则说明arr[index+1]则为要插入的部分 while (index >= 0 && temp < arr[index]){ arr[index+1] = arr[index]; //依次移动数据 index --; } // 在arr[index+1]中插入数据 arr[index+1] = temp; } return arr; } 5.4 希尔排序( 缩小增量排序 )基本思想: 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
安照一定的步长,将一定数量的数据分为一组。设置每组的数据增量为上一次增量的一半,然后将每组的数据量增加,数组减少,直到只剩下一个数组为止。
希尔排序方法:
对有序序列插入时采用交换法
对有序序列插入时采用移动法
/** * 希尔交换法 * @param arr * @return */ public static int[] shellSort(int[] arr){ int temp = 0; int count = 0; for(int gap = arr.length/2; gap > 0; gap /= 2){ for(int i=gap; i< arr.length; i++){ // 遍历组中的所有数据,gap为步长 for(int j=i-gap; j >= 0; j -= gap){ if(arr[j] > arr[j+gap]){ temp = arr[j]; arr[j] = arr[j+gap]; arr[j+gap] = temp; } } } } return arr; } // 移动位置(结合插入排序) public static int[] shellMoveSort(int[] arr){ for(int gap = arr.length/2; gap > 0; gap /= 2){ for(int i=gap; i < arr.length; i++){ int j = i; int temp = arr[j]; if(arr[j] < arr[j-gap]){ while (j - gap >= 0 && temp < arr[j - gap]){ arr[j] = arr[j-gap]; j -= gap; } arr[j] = temp; } } } return arr; } 5.5 快速排序