2021.09.12学习
1.快速排序(对n个数进行排序)
1)一趟快速排序:首先是有一个key,i和j,初始key等于最左边的A[0],i=0,j=n-1;先从右到左找到第一个比key小的数(A[j]),然后A[j]和A[i]互换,再跳到左边,从左到右找到第一个比key大的数,然后再互换A[i]和A[j];一直循环下去,直到i=j。
注意:key是一个固定值,是随着交换值位置变化而变化的
2)然后左右两边的数再进行同样的排序,即递归
2.二分法(长度为n的有序数列)
1)左闭右闭区间:[a,b] 首先取中间值mid=a+((b-a)>>2),然后循环条件是a<=b(a=b是有意义的,因为b对应的数的位置有数),(a=0,b=n-1)

1 class Solution { 2 public int search(int[] nums, int target) { 3 // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算 4 if (target < nums[0] || target > nums[nums.length - 1]) { 5 return -1; 6 } 7 int left = 0, right = nums.length - 1; 8 while (left <= right) { 9 int mid = left + ((right - left) >> 1); 10 if (nums[mid] == target) 11 return mid; 12 else if (nums[mid] < target) 13 left = mid + 1; 14 else if (nums[mid] > target) 15 right = mid - 1; 16 } 17 return -1; 18 } 19 }
2.左闭右开区间:[a,b)

1 class Solution { 2 public int search(int[] nums, int target) { 3 int left = 0, right = nums.length; 4 while (left < right) { 5 int mid = left + ((right - left) >> 1); 6 if (nums[mid] == target) 7 return mid; 8 else if (nums[mid] < target) 9 left = mid + 1; 10 else if (nums[mid] > target) 11 right = mid; 12 } 13 return -1; 14 } 15 }

浙公网安备 33010602011771号