1. 程式人生 > 其它 >2021.09.12學習

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 }