面试遇到手写个快速排序,只知道原理,没手动写过0 0!,现手写下,增加点记忆。
原理基本就是:找一个基准,然后将比它大的放右边,比它小的放左边。然后在左右的范围内重新按照前面的方法执行,直到全部执行完。
实现方法:参照《坐在马桶上看算法:快速排序》
具体实现如下:(若有不对之处,欢迎指出,共同进步)
public int partition(int[] arr,int left,int right){ //选择第一个数为标准 int flag = arr[left-1]; int i = left-1; //j从右往左进行比较 for(int j = right-1; j >= left-1 ;j--){ //根据j下标找到比标准小的数 if(arr[j] < flag){ //i只要没有遇到j就往右找 //当找到数,就和j的下标的数进行交换 while(arr[i] <= flag && i < j){ i++; } int tmp = arr[j]; arr[j] = arr[i]; arr[i] = tmp; } //i遇到j,表明此次循环已执行完,当前数和标准进行交换 if(i == j){ arr[left-1] = arr[i]; arr[i] = flag; break; } } return i+1; }
public void quickSort(int[] arr,int left,int right){ if(left < right){ int dp = partition(arr,left,right); quickSort(arr,left, dp-1); quickSort(arr,dp+1, right); } }