快速排序算法代码实现
上代码:
package com.liu.pro; import java.util.Arrays; public class quickSort { public static void main(String[] args) { int[] arr = {9,8,5,6,2,7,1,3,4}; sort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } /** * 快速排序 * @param arr 传入的数组 * @param left 左指针 * @param right 右指针 */ public static void sort(int[] arr,int left,int right){ // 定义一个左指针和右指针 int l = left; int r = right; // 定义一个中间索引为中间值 int pivot = arr[(left + right) / 2]; // 循环 while (l < r) { // 在数组左侧找一个比中间值大的数,有比中间之大的数就退出循环,否则就一直寻找 while (arr[l] < pivot) { l += 1; } // 同上,//最坏的情况是找到中间值 while (arr[r] > pivot) { r -= 1; } // 如果左指针大于等于右指针,则退出循环 if (l >= r) { break; } // 上述循环完成后,程序就找到了一个比中间值大的数值和一个比中间值小的数值,然后进行交换 int temp = arr[l]; arr[l] = arr[r]; arr[r] = temp; // 右指针进行移动,此时arr[r]这个数本身就放在右边了,所以右指针左移 if (arr[l] == pivot) { r--; } // 左指针进行移动,此时arr[l]这个数本身就放在左边了,所以左指针右移 if (arr[r] == pivot) { l++; } } // 为了防止无法退出while循环,错开左右两个指针 if (l == r) { l += 1; r -= 1; } // 右指针没有遍历完成,向左进行递归 if (left < r) { sort(arr, left, r); } // 左指针没有遍历完成,向右进行递归 if (right > l) { sort(arr, l, right); } } }
时间复杂度为:O(nlogn)
测试结果: