数组高级

数组高级

二分查找

 1 二分查找思路: 查找元素的索引,一次排除一半的元素
 2     1.计算开始索引和结束索引
 3            start = 0;
 4            end = array.length-1
 5     2.计算中的索引 mid = (start+end)/2;
 6     3.让中间元素和目标元素key进行比较
 7         array[mid]>key 时: end=mid-1
 8         array[mid]<key 时:start=mid+1
 9         array[mid]==key 时:mid就是要找的索引
10 
11     4.循环执行2.3步骤,直到start>end结束。如果没有找到返回-1
 1 public class ArrayDemo1 {
 2     public static void main(String[] args) {
 3         int[] array = {1, 2, 3, 4, 5, 6, 7, 8};
 4 
 5         //调用二分查找的方法
 6         int index = binarySearch(array, 9);
 7         System.out.println(index);
 8     }
 9 
10     //需求:查找数组中指定元素出现的索引
11     public static int binarySearch(int[] array, int key) {
12         //1.计算开始索引和结束索引
13         int start = 0;
14         int end = array.length - 1;
15         //如果start <= end;就可以一直找
16         while (start <= end) {
17             //2.计算中的索引 mid = (start+end)/2;
18             int mid = (start + end) / 2;
19             // 3.让中间元素和目标元素key进行比较
20             if (array[mid] > key) {
21                 //array[mid]>key 时: end=mid-1
22                 end = mid - 1;
23             } else if (array[mid] < key) {
24                 //array[mid]<key 时:start=mid+1
25                 start = mid + 1;
26             } else {
27                 //array[mid]==key 时:mid就是要找的索引
28                 return mid;
29             }
30         }
31         //如果没有找到,就返回-1
32         return -1;
33     }
34 }

 

冒泡排序

冒泡排序的规则:
1.相邻两个元素两两比较,小的放前面,大的放后面。
2.一共比较的轮数是n-1轮
3.每一轮比较,要上前一轮少一次

 1 //对元素进行排序
 2 public static void sort(int[] array) {
 3     //1.确定比较的轮数,长度-1
 4     for (int i = 0; i < array.length - 1; i++) {
 5         //2.每一轮比较的次数,比前一轮少1次
 6         for (int j = 0; j < array.length - 1 - i; j++) {
 7             //3.每一轮相邻的两个元素进行比较,大的往后的,小的往前放
 8             if (array[j] > array[j + 1]) {
 9                 int temp=array[j];
10                 array[j]=array[j+1];
11                 array[j+1]=temp;
12             }
13         }
14     }
15 }

 

快速排序

快速排序的思路
1.把0索引的元素确定为基准数
2.从右往左找比基准数小的
3.从左往右找比基准数大的
4.把左右两边的数据交换
5.基准数归位

 1 public class ArrayDemo3 {
 2     public static void main(String[] args) {
 3         int[] array = {6, 8, 7, 5, 3, 4, 2};
 4         quiteArray(array, 0, array.length - 1);
 5 
 6         //遍历数组中的元素,并打印
 7         String s = Arrays.toString(array); 
 8         System.out.println(s);
 9     }
10 
11     public static void quiteArray(int[] array, int left, int right) {
12         //递归的出口
13         if (right < left) { return; }
14         //先记录开始索引和结束索引的位置
15         int left0 = left;
16         int right0 = right; 
17         //定义基准数
18         int baseNumber = array[left0];
19         while (left != right) {
20             //从右往左,找比基准数小的
21             while (array[right] >= baseNumber && right > left) {
22                 right--;
23             }
24             //从左往右,找比基准数大的
25             while (array[left] <= baseNumber && right > left) {
26                 left++;
27             }
28             //把左右两边的数据进行交换
29             int temp = array[left];
30             array[left] = array[right];
31             array[right] = temp;
32         }
33         //把left位置的元素放在left0位置
34         array[left0] = array[left];
35         //基准数放在left位置
36         array[left] = baseNumber;
37         //左右两部分分别快速排序
38         quiteArray(array, left0, left - 1);
39         quiteArray(array, right + 1, right0);
40     } 
41 }

 

posted @ 2021-05-19 21:36  依然耀眼  阅读(61)  评论(0)    收藏  举报