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 }

 

posted @ 2021-09-13 10:04  Liveforlove  阅读(40)  评论(0)    收藏  举报