一、快速排序
1、算法思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序的序列。
2、实现思路
a、以第一个关键字k1为基数,将[k1,k2,k3....Kn]这个数据分成两部分,使左区域所有的值都小于等于k1,右区域所有的值都大于等于k1,最后确定两区域的中间位置,这个时候两个子区域的值处于无序状态。
b、把左区域做为一个整体,用a步骤进行处理,右区域进行相同的处理。(即递归操作)
c、重复a、b步骤,直到处理完毕。
二、直接插入排序
1、算法概念:
每次从无序的数据中取出第一个元素,把它插入到有序的数据中的合适位置,使无序表变得有序。
2、算法思想:
假设待排序的记录存放在数组A[1...n]中,初始是,A[1]自成一个有序的序列,无序的数据为A[2...n],从i=2起直至i=n为止,依次将A[i]插入到当前有序的区域R[1,i-1],生成含n个记录的有序序列。
3、算法实现:
a、使用一个临时变量temp存储第i个元素(i>=1,下标从0开始)
b、比较temp和A[i-1],如果temp比A[i-1]小,则A[i]=A[i-1],即比temp大的元素集合依次往右移动一位。
c、将temp的值赋给A[i];
三、希尔排序
1、算法介绍:
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
2、算法思想:
算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。
代码实现
1、快速排序,只要找到一次的执行原理,递归调用自己就可。
/** * @param args快速排序//逐级找中间一分为二排序 */ public static void fastSort(int[] array, int low, int high) { //递归实现过程 if (low < high) { int middle = findMiddle(array, low, high); //System.out.println("middle " + middle); fastSort(array, low, middle - 1); //System.out.println(" ---left " + Arrays.toString(array)); //System.out.println("+++++middle " + middle); fastSort(array, middle + 1, high); //System.out.println(" +++right " + Arrays.toString(array)); } } private static int findMiddle(int[] array, int low, int high) { /* //将数组数据小于temp的放在左边,大于的放在右边. 1)、从右边最高位开始比较,如果temp > array[high],将array[high]赋值给array[low] 2)、第一步交换后,从左边最低位low开始比较,如果temp < array[low],将执行 array[high] = array[low]; 3)、最后将temp 赋值给array[low] . 如果打印执行过程,就会很清晰。 */ // low = 0; // high = array.length - 1; int temp = array[low]; while (low < high) { while (low < high && temp <= array[high]) { high--; } array[low] = array[high]; while (low < high && temp >= array[low]) { low++; } array[high] = array[low]; } array[low] = temp; System.out.println("-array: " + Arrays.toString(array)); return low; }
2、插入排序相对较简单,每一个数每次和他前面的数比较,找到第一个比较小的和最后一个比他大的数中间插入。实现过程是:用变量存储起来,只要比他大就将比他大的值赋值给它原来的位置,然后做标前移,重复上述步骤,直到不再满足比他大,将t存储emp变量值赋值给不比它大的数据的坐标 +1 的位置。
/** * 直接插入排序 */ public static void insertSort(int []array){ //13, 6, 20, 15, 1, 8, 1 int j = 0; for (int i = 0; i < array.length; i++) { int temp = array[i]; j = i - 1; while(j >= 0 && temp < array [j]){ array[j+1] = array[j]; j--; // System.out.println("-------" + Arrays.toString(array)); } array[j+1] = temp; System.out.println("++++++++++" + Arrays.toString(array)); } }
3、希尔排序 对比直接插入排序,你会发现仅仅是希尔排序先比较间隔为长度一半的两个元素,交换位置。逐渐缩小间隔来实现。
/** * 希尔排序 */ public static void shellSort(int []array){ int length = array.length; int d = length / 2; while(d >= 1){ int j = 0; for (int i = 0; i < array.length; i++) { int temp = array[i]; j = i - d; while(j >= 0 && temp < array [j]){ array[j+d] = array[j]; j -= d; } array[j+d] = temp; } d /= 2; System.out.println("-------" + Arrays.toString(array)); } }