最高效能的排序法是哪个呢??冒泡排序还是选择排序,还是插入排序呢?这些都不是,我们已经进入了高效的排序时代了——————快速排序法
快速排序法思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都小
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序法的效率是最高的!!!!!!!!!!!!!!!
- <p>class Test1 {
- public static void main(String[] args) {
- // 定义一个任意数组
- int[] arr = { 34, 3, 53, 2, 23, 7, 14, 10 };
- // 选择用快速排序法,定义方法的初始的形式参数
- // 数组的上边界
- int low = 0;
- // 数组的下边界
- int high = arr.length - 1;
- // 调用方法,传入参数
- quickSort(arr, low, high);
- //遍历数组打印
- for(int n:arr){
- System.out.print(n+",");
- }
- }</p>
复制代码- <p> public static void quickSort(int[] arr, int lowNum, int highNum) {
- //当两个边界重合的时候,就停止递归
- if(lowNum>=highNum)
- return;
- //根据快速排序法的原理选取数组的第一个元素作为参照元素
- int mid = arr[lowNum];
- int low = lowNum;
- int high = highNum;
- // 第一个元素作为参照循环比较之后的元素,完成排序
- while (low < high) { // 只要最小的角标小于最大的就是说本段的数组的排序没有完成
- // 先从数组的最后变开始向前遍历
- while (low < high&&arr[high] >= mid)
- // 自后向前遍历,直到遇到比中中轴值小的元素
- high--; // 向前遍历,索引值减1
- // 遇到比temp小的值就会停止循环,并且交换数值
- if(low<high){
- //int temp=arr[low];
- arr[low] = arr[high]; // 高效的交换方式,不用担心,arr[low]上的元素被覆盖,因为temp中还有此中轴值
- //arr[high]=temp; // 减少交换次数,提高效率
- }
-
- // 从数组的前段开始遍历,向后遍历,low变化
- while (low < high && arr[low]<=mid)
- // 当low和high没有重合,并且前面的值都小于中轴值的时候遍历继续
- low++; // 循环控制元素,做向后遍历
- // 当不满足条件,也就是说在前段找到了比temp大的值,停止循环,交换元素
- if(low<high){
- //int temp=arr[high];
- arr[high] = arr[low]; // 将此值和中轴所在位置的元素交换,此为高效写法,减少交换次数,提高效率
- //arr[low]=temp; // arr[high]中的值已经存放在最前端了
- }
-
-
- // 此时的low和high还没有重合,也就是说还没有完成一次完整的排序,必须借助循环
- // 让中轴值所在的位置之前的所有元素都比其小,位置之后的元素都比其大</p><p> }
- // 循环停止,也就是说此时low和high重合,即low=high,已经完成了一次完整的排序
- //将中轴值赋值
- arr[low]=mid;
-
- // 那么以中轴为界,将数组在分为两组,继续排序
- // 对于两边的数组递归调用方法quickSort(),直到完成排序</p><p> // 对于前面一组的数组,前段值和后端值
- quickSort(arr, lowNum, low - 1);
- // 对于后面一组数组
- quickSort(arr, low + 1, highNum);
- }
- }</p>
复制代码
研究了很长时间的,终于写出来了,思想是一样,就是写法不一样,其他的很多都是两个方法,我只用了一个。使用递归,一定要注意结束条件,不然那酸爽你懂的!!!
|
|