ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java的查找算法和排序算法 [打印本页]

作者: 诗林    时间: 2024-10-28 12:57
标题: Java的查找算法和排序算法
一、查找算法

1. 基本查找


a. 示例


  1. import java.util.ArrayList;
  2. public class Demo2 {
  3.     public static void main(String[] args) {
  4.         int[] arr = {131, 127, 147, 81, 103, 23, 7, 79, 81};
  5.         System.out.println(searchNumber(arr, 81));
  6.     }
  7.     public static ArrayList<Integer> searchNumber(int[] arr, int number){
  8.         ArrayList<Integer> list = new ArrayList<>();
  9.         for (int i = 0; i < arr.length; i++) {
  10.             if (arr[i] == number) {
  11.                 list.add(i);
  12.             }
  13.         }
  14.         return list;
  15.     }
  16. }
复制代码

2. 二分查找


a. 示例

  1. public class Demo3 {
  2.     public static void main(String[] args) {
  3.         int[] arr = {7, 23, 79, 81, 103, 127, 131, 147};
  4.         System.out.println(BinarySearch(arr, 127));
  5.     }
  6.     public static int BinarySearch(int[] arr, int number){
  7.         // 定义范围
  8.         int min = 0;
  9.         int max = arr.length;
  10.         while (true) {
  11.             if (min > max) {
  12.                 return -1;
  13.             }
  14.             // 定义中间索引
  15.             int mid = (min + max) / 2;
  16.             // 核心代码
  17.             if (arr[mid] > number) {
  18.                 max = mid - 1;
  19.             } else if (arr[mid] < number) {
  20.                 min = mid + 1;
  21.             } else if (arr[mid] == number) {
  22.                 return mid;
  23.             }
  24.         }
  25.     }
  26. }
复制代码

3. 插值查找


4. 斐波那契查找


5. 分块查找


a. 示例


  1. package day18.search;
  2. public class Demo4 {
  3.     public static void main(String[] args) {
  4.         int[] arr = {16, 5, 9, 12, 21, 18, 32, 23, 37, 26, 45, 34, 50, 48, 61, 52, 73, 66};
  5.         // 块对象
  6.         Block b1 = new Block(21, 0, 5);
  7.         Block b2 = new Block(45, 6, 11);
  8.         Block b3 = new Block(73, 12, 17);
  9.         Block[] blockArr = {b1, b2, b3};
  10.         int number = 66;
  11.         // 现确定在哪一块
  12.         int index = getIndex(blockArr, arr, number);
  13.         // 在块中查找
  14.         System.out.println(index);
  15.     }
  16.     private static int getIndex(Block[] blockArr, int[] arr, int number) {
  17.         int indexBlock = findIndexBlock(blockArr, number);
  18.         if (indexBlock == -1) {
  19.             return -1;
  20.         }
  21.         int startIndex = blockArr[indexBlock].getStartIndex();
  22.         int endIndex = blockArr[indexBlock].getEndIndex();
  23.         for (int i = startIndex; i <= endIndex; i++) {
  24.             if (arr[i] == number) {
  25.                 return i;
  26.             }
  27.         }
  28.         return -1;
  29.     }
  30.     public static int findIndexBlock(Block[] blockArr, int number){
  31.         for (int i = 0; i < blockArr.length; i++) {
  32.             if (number <= blockArr[i].getMax()) {
  33.                 return i;
  34.             }
  35.         }
  36.         return -1;
  37.     }
  38. }
  39. class Block{
  40.     private int max;  // 块中最大值
  41.     private int startIndex;  // 起始索引
  42.     private int endIndex;  // 结束索引
  43.     public Block() {
  44.     }
  45.     public Block(int max, int startIndex, int endIndex) {
  46.         this.max = max;
  47.         this.startIndex = startIndex;
  48.         this.endIndex = endIndex;
  49.     }
  50.     public int getMax() {
  51.         return max;
  52.     }
  53.     public void setMax(int max) {
  54.         this.max = max;
  55.     }
  56.     public int getStartIndex() {
  57.         return startIndex;
  58.     }
  59.     public void setStartIndex(int startIndex) {
  60.         this.startIndex = startIndex;
  61.     }
  62.     public int getEndIndex() {
  63.         return endIndex;
  64.     }
  65.     public void setEndIndex(int endIndex) {
  66.         this.endIndex = endIndex;
  67.     }
  68. }
复制代码

二、排序算法

1. 冒泡排序


a. 示例


  1. import java.util.Arrays;
  2. public class Demo1 {
  3.     public static void main(String[] args) {
  4.         int[] arr = {2, 1, 4, 5, 3};
  5.         // 循环多少轮
  6.         for (int i = 0; i < arr.length-1; i++) {
  7.             // 每一轮排序
  8.             for (int j = 0; j < arr.length - 1 - i; j++) {
  9.                 if (arr[j] > arr[j + 1]) {
  10.                     int temp = arr[j];
  11.                     arr[j] = arr[j + 1];
  12.                     arr[j + 1] = temp;
  13.                 }
  14.             }
  15.         }
  16.         System.out.println(Arrays.toString(arr));
  17.     }
  18. }
复制代码

2. 选择排序


a. 示例


  1. import java.util.Arrays;
  2. public class Demo2 {
  3.     public static void main(String[] args) {
  4.         int[] arr = {2, 1, 6, 8, 3};
  5.         // 进行比较的索引值
  6.         for (int i = 0; i < arr.length; i++) {
  7.             // 拿每个索引值对应的元素与后面的每个元素进行比较
  8.             // 每完成一轮,索引值加1
  9.             for (int j = i + 1; j < arr.length; j++) {
  10.                 if (arr[i] > arr[j]) {
  11.                     int temp = arr[i];
  12.                     arr[i] = arr[j];
  13.                     arr[j] = temp;
  14.                 }
  15.             }
  16.         }
  17.         System.out.println(Arrays.toString(arr));
  18.     }
  19. }
复制代码

3、插入排序


a. 示例


  1. import java.util.Arrays;
  2. public class Demo3 {
  3.     public static void main(String[] args) {
  4.         int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
  5.         // 找到无序的那一组数据从哪个索引开始
  6.         int startIndex = -1;
  7.         for (int i = 0; i < arr.length; i++) {
  8.             if (arr[i] > arr[i + 1]) {
  9.                 startIndex = i + 1;
  10.                 break;
  11.             }
  12.         }
  13.         // 遍历从startIndex开始到最后一个元素
  14.         for (int i = startIndex; i < arr.length; i++) {
  15.             // 记录索引,以防被修改
  16.             int j = i;
  17.             // 遍历交换位置
  18.             while (j > 0 && arr[j] < arr[j - 1]) {
  19.                 int temp = arr[j];
  20.                 arr[j] = arr[j - 1];
  21.                 arr[j - 1] = temp;
  22.                 j--;
  23.             }
  24.         }
  25.         System.out.println(Arrays.toString(arr));
  26.     }
  27. }
复制代码

4. 快速排序(效率最高)


a. 示例


  1. import java.util.Random;
  2. public class Demo6 {
  3.     public static void main(String[] args) {
  4.         Random random = new Random();
  5.         int[] arr = new int[1000000];
  6.         for (int i = 0; i < arr.length; i++) {
  7.             arr[i] = random.nextInt();
  8.         }
  9.         
  10.         long start = System.currentTimeMillis();
  11.         quickSort(arr, 0, arr.length - 1);
  12.         long end = System.currentTimeMillis();
  13.         System.out.println("共用时: " + (end-start));
  14.     }
  15.     public static void quickSort(int[] arr, int startIndex, int endIndex) {
  16.         if (startIndex > endIndex) return;
  17.         // 记录索引值,防止被修改
  18.         int start = startIndex;
  19.         int end = endIndex;
  20.         // 记录基准数
  21.         int baseNumber = arr[startIndex];
  22.         // 利用循环找到要交换的数
  23.         while (start != end) {
  24.             // 从end往前找
  25.             while (end > start && arr[end] >= baseNumber) end--;
  26.             // 从start往后找
  27.             while (end > start && arr[start] <= baseNumber) start++;
  28.             // 交换start和end
  29.             int temp = arr[end];
  30.             arr[end] = arr[start];
  31.             arr[start] = temp;
  32.         }
  33.         // 基准数归位
  34.         int temp = arr[startIndex];
  35.         arr[startIndex] = arr[end];
  36.         arr[end] = temp;
  37.         // 确定6左边的范围
  38.         quickSort(arr, startIndex, start - 1);
  39.         // 确定6右边的范围
  40.         quickSort(arr, end + 1, endIndex);
  41.     }
  42. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4