学的东西还是要多分享,分享给别人的过程中才会知道自己原来有的地方并不是很清楚,今天就再复习一次排序算法了,我希望大家看了之后对排序算法能够有进一步的了解,也是对自己知识的巩固~
先了讲讲比较复杂的快速排序好了
快速排序
快速排序的基本思想就是用一个中间值,将待排序的内容分为:小于等于中间值的部分 大于中间值的部分,形成局部有序。然后再递归的排序小于等于中间值的部分、大于中间值的部分。
那么在算法实现上,我们需要两个指针:i、j,其中j的取值范围为0-n-1,用来遍历待分区的数组元素,而i的初始值为-1,用来指向在小于等于中间值部分中的最后一个元素的位置。这样当我们遍历j的时候,我们比较j元素和中间值的大小:如果小于等于中间值,那么意味要将j元素放在i+1的位置上,同时要将i+1,更新最后一个小于等于中间值的元素的位置;如果大于中间值,那么i不变;因此我们可以知道在【0,i】区间内的元素都是小于等于中间值的,而i+1,n-1的范围内时大于中间值的元素,这样下次递归就有目标了。
//快速排序 public static void quickSort(int[] arrays, int start, int end){ if(end <= start)return; int key = arrays[end]; int lessIndex = start-1; for(int i= start; i < end; i++){ if(arrays[i] < key){ lessIndex++; int temp = arrays[lessIndex]; arrays[lessIndex] = arrays[i]; arrays[i] = temp; } } lessIndex++; arrays[end] = arrays[lessIndex]; arrays[lessIndex] = key; quickSort(arrays, start, lessIndex-1); quickSort(arrays, lessIndex+1, end); }
堆排序
堆排序和选择排序的思想一致,只不过在堆排序中是通过堆来获得n-1个布局最大值的。所谓的堆的定义:大顶堆:左右子树根节点要小于根节点,同时左右子树也是一个大顶堆。在这个实现中,主要的一个算法是如何在更换了根节点之后,将这个元素下沉到它应该在的位置上。
percDown(int a[],int root,int max)表示将元素root下沉到合适的位置,然后最大的指针为max。
这样在排序的时候就能够利用这个函数了。
//8:堆排序 public static void heapSort(int[] arrays){ int len = arrays.length; if(len <= 1)return; for(int i= (len/2-1); i>=0; i--){ if(2*i+1 < len){//如果存在左子树 int maxT = 2*i+1; if(2*i+2 < len && arrays[2*i+2] > arrays[maxT]) maxT = 2*i+2; if(arrays[maxT] > arrays[i]){ int temp = arrays[maxT]; arrays[maxT] = arrays[i]; arrays[i] = temp; } } } for(int i=len-1; i>0; i--){ int temp = arrays[i]; arrays[i] = arrays[0]; arrays[0] = temp; percDown(arrays, i); } } public static void percDown(int[]arrays, int len){ int unSetV = arrays[0]; int i=0; while(2*i + 1 < len){//当存在左子树当时候 int maxT = 2*i + 1; if(2*i+2 < len && arrays[2*i+2] > arrays[maxT]) maxT = 2*i+2; if(arrays[maxT] > arrays[i]){ arrays[i] = arrays[maxT]; i=maxT; }else break; } arrays[i] = unSetV; }
冒泡排序
冒泡排序核心思想就是要用两层for循环,第一层for循环是表明我要找n次最大值(或者最小值),把他们放在他们应该放置的位置上,而第二层for循环解决的就是我怎么找到次的最大值,在冒泡排序中第二次for循环就是通过比较并交换相邻两个元素的值来实现次最大值的寻找,在冒泡排序中交换的次数可能会比较多。
//冒泡排序 public static void bubbleSort(int[] arrays){ if(arrays.length<=1)return;