1、两种不同的排序方法
图解:https://blog.csdn.net/csdnsevenn/article/details/81844085
1.1、挖坑法
总结:就是基准所在的位置被挖了一个坑,然后不断的填坑、挖坑
1.2、指针交换法
总结:就是比较不挖坑,而是交换。
2、时间复杂度
时间复杂度只和选的基准有关。如果基准选的不好,比如想正序排序,但是数组是 9,8,7,6,5这种倒序排列的,此时选择第一位,即9为基准,就会导致整个排序算法的复杂度退化成n平方。
3、代码实现
// 解法3: 挖坑法// arr[l++] = arr[r];说明左边的坑被填上了:public void quick2(int[] arr, int left, int right) {//先判断left<right,为true才能遍历if (left < right) {int pivot = arr[left], l = left, r = right;while (l < r) {while (arr[r] >= pivot && l < r) { // arr[r]>= pivot// ,这里加=,是为了不移动和pivot相等的元素,节约减少系统操作r--;}if (l == r) {//如果l=r,就遍历到头了,退出break;}//如果右边停下了,挖出来填左边坑,然后让左边去走arr[l++] = arr[r];while (arr[l] <= pivot && l < r) {l++;}if (l == r) {//如果l=r,就遍历到头了,退出break;}// 如果左边停下了,挖出来填右边坑,然后让右边去走arr[r--] = arr[l];}//不管是左边遍历右边,还是右边遍历左边,最后退出后一定有 l==r;//因为右边遍历左边的时候,左边一定有个坑了(此时坑的索引是l),如果这个循环一直r--,直到l=r的时候退出,那么最后r一定也在坑里。//同理左边遍历右边的时候,右边一定有个坑了(此时坑的索引是r),如果这个循环一直l++,直到l=r的时候退出,那么最后l一定也在坑里。//此时直接让pivot去填上这个坑就行了。arr[l] = pivot;quick2(arr, left, l - 1);quick2(arr, r + 1, right);}}
// 解法1:public void quickSort(int[] arr, int left, int right) {int l = left, r = right, pivot = arr[(left + right) / 2];int temp = 0;//while循环使 比pivo t值小的放左边//比pivot大的放右边while (l < r) {//在pivot的左边一直找,找到 >= pivot的值,才退出while (arr[l] < pivot) l++;//在pivot的右边一直找,找到 <= pivot的值,才退出while (arr[r] > pivot) r--;//如果l >= r说明pivot的左边全都小于pivot,右边全大于if (l == r) break;//交换temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交换完后,arr[l] == pivot,r--,前移if (arr[l] == pivot) r--;if (arr[r] == pivot) l++;}// 如果 l==r,必须l++,r--,否则会出现栈溢出if (l == r) {l++;r--;}//向左递归if (left < r) quickSort(arr, left, r);if (right > l) quickSort(arr, l, right);}
赫本一生改嫁三次,都没有选择纪梵希,而纪梵希一生未娶,大概真爱的真谛不是占有,而是,我喜欢你,你随意即可
赫本一生改嫁三次,都没有选择纪梵希,而纪梵希一生未娶,大概真爱的真谛不是占有,而是,我喜欢你,你随意即可
