算法思想总结

  • 二分排序
  • 冒泡排序
  • 判断给定的数组是否已经排序,是返回true,否返回false
  • 数组逆序
  • 将给定的数组中,偶数放前面,奇数放后面输出。eg:1234   输出:4231
  • 判断二进制1的个数

一、二分排序

  public static int count = 0;
    public static int binarySearch(int[] arr,int key){
        int left =0;
        int right = arr.length-1;
        while(left <= right){
            count++;
            int mid = (left+right)/2;//相当于无类型替换(left+right)>>>1  无符号右移一位>>>1
         if(arr[mid] < key){
             left = mid + 1;
         }else if(arr[mid]>key){
             right = mid-1;

         }else{
             return mid;
         }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] array = new int[10000];
        for(int i = 0; i < array.length;i++){
            array[i]=i;
        }
//        System.out.println(binarySearch(array,9999));
//        System.out.println(count);
        System.out.println( Arrays.binarySearch(array,9999));
        System.out.println(Arrays.binarySearch(array, 5, 20,19));//[ )  from  to

    }

二、冒泡排序

//冒泡排序
 public static int[] bubbleSort(int[] arr){
        for(int i = 0; i < arr.length-1; i++){
            for(int j = 0; j < arr.length-1-i; j++){
                    if(arr[j] > arr[j+1]){
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                        flag = true;
                    }
             }
       
        }
        return arr;
    }    
//优化后的冒泡排序
    public static int[] bubbleSort(int[] arr){
    boolean flag =false;//没有发生交换
        for(int i = 0; i < arr.length-1; i++){
            for(int j = 0; j < arr.length-1-i; j++){

                    if(arr[j] > arr[j+1]){
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                        flag = true;
                    }
             }
            if(flag == false){
                break;
            }
        }
        return arr;
    }
  public static void main(String[] args) {
        int[] array = {1,3,5,16,9};
        System.out.println(Arrays.toString(bubbleSort(array)));
    }

三、判断给定的数组是否已经排序,是返回true,否返回false

 public static boolean isUp(int[] arr){
        int min = arr[0];
        for(int i = 1; i < arr.length; i++){
//1,3,5,16,9
            if(min < arr[i]){
                min = arr[i];
                continue;
            }else{
                return false;
            }

        }
        return true;

    }
    public static void main(String[] args) {
        int[] array = {1,3,5,16,9};
        System.out.println(isUp(array));
        System.out.println(isSorted(array));

    }
    public static boolean isSorted(int[] arr){
        for(int i = 0; i < arr.length-1; i++){
            if(arr[i] > arr[i+1]){
                return false;
            }
        }
        return true;
    }

四、将给出的数组逆序输出

 //数组逆序  逆序的思想,从两端出发,结束条件是相遇
    public static int[] reverse(int[] arr){
        int left = 0;
        int right = arr.length-1;
       while(left < right){
           int temp = arr[left];
           arr[left] = arr[right];
           arr[right] = temp;
           left++;
           right--;
       }
       return arr;
    }
    public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7};
        System.out.println(Arrays.toString(reverse(array)));
    }

五、将给定的数组中,偶数放前面,奇数放后面输出。eg:1234   输出:4231

  •  //将数组中的偶数放在前面,奇数放在后面  思想同上,从左边和右边出发,
        // 如果左边遇到奇数停下,右边遇到偶数停下,交换两个数,终止条件是相遇
        public static int[] change(int[] arr){
            int left = 0;
            int right = arr.length-1;
           while(left < right){
            while(left < right && arr[left] % 2 == 0){//注意易错点:是arr[left]判断,不是对下标判断
                left++;//一直加加不安全,可以下标越界 所以加上条件left < right
            }
            while(left < right && arr[right] % 2 != 0){
                right--;
            }
            if(left < right){//加上这个条件是因为上面循环退出有两种情况 1.left = right 2.遇到奇数
    
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }
           }
        return arr;
        }
    
        public static void main(String[] args) {
            int[] array = {1,2,3,4};
            System.out.println(Arrays.toString(array));
            System.out.println(Arrays.toString(change(array)));
        }

六、判断二进制1的个数

思想:判断每一位是不是1,即让当前数字和1相与

    public static void main(String[] args) {//psvm
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int count = 0;
        for( int i = 0; i < 32; i++){
          if(((n>>i) & 1) == 1)  {
              count++;
          }
        }
        System.out.println(count);

    }

 思路:n&(n-1) == 0时,相与的次数就是2进制1的个数

  public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n =scan.nextInt();
        int count = 0;
        while(n != 0){
           n = n&(n-1);
           count++;
        }
        System.out.println(count);

七、将给出的二进制数的偶数位和奇数位的数字分别输出 eg:1234   输出:4231

import java.util.Arrays;

/**
 * @program: sixiang
 * @description
 * @author: wenwen
 * @create: 2021-07-07 10:55
 **/
//奇数放后面 偶数放前面  eg:1234   输出 :4231
public class even {
    public static int[] evenOdd(int[] arr){
      int  left = 0;
      int right = arr.length - 1;
      for(int i = 0; i <= arr.length-1; i++){
            while(left < right && arr[left] % 2 ==0){
                left++;
            }
            while(left < right && arr[right] % 2 != 0){
                right--;
            }
            if(left < right){
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }
        }
      return arr;
    }
    public static void main(String[] args) {
        int[] array = {1,2,3,4,4,5,6,9};
        System.out.println( Arrays.toString(evenOdd(array))); ;
    }
}

八、求两个数的最大公约数

/**
 * @program: sixiang
 * @description
 * @author: wenwen
 * @create: 2021-07-07 08:22
 **/
public class gongYue {
    public static int gonYe(int m,int n){
        while(m % n != 0){
             int temp = m % n;
             m = n;
             n = temp;
            System.out.println(m+" "+n);
        }
        return n;
    }
    public static void main(String[] args) {
        int m = 12;
        int n = 24;
        System.out.println(gonYe(12,24));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kruskal算法是一种用于求解最小生成树的贪心算法,它的基本思想是:按照边权从小到大的顺序,逐个加入到生成树中,如果加入该边会形成环,则不加入该边,直到生成树中有n-1条边为止。具体实现过程如下: 1. 将所有边按照边权从小到大排序; 2. 依次枚举每条边,如果该边的两个端点在同一个集合中,则不加入该边,否则加入该边,并将两个端点所在的集合合并成一个集合; 3. 直到生成树的边数为n-1时停止。 Kruskal算法的时间复杂度为O(mlogm),其中m为边数。它的优点是简单易实现,且能够在保证最小生成树的情况下尽可能地保证连通性。 ### 回答2: Kruskal算法是一种用于解决最小生成树问题的贪心算法。它的思想是从图中的所有边中选取权重最小的边,并且保证边的选取不会构成一个环,逐步构建最小生成树。 具体实现Kruskal算法的步骤如下: 1. 初始化一个空的最小生成树MST和一个边集合E,边集合E包含图中的所有边,并按照权重从小到大排序。 2. 从E中选择权重最小的边,并将其从边集合E中移除。 3. 如果选择的边不会与MST中的边构成环路,将其加入MST中。 4. 重复步骤2和3,直到MST包含了图中的所有顶点。 5. 最终得到的MST即为图的最小生成树。 Kruskal算法的关键在于如何判断选取的边是否会构成环路。为了实现这一点,可以使用并查集数据结构来记录每个顶点所属的连通分量,检查是否存在连通分量的根节点相同的两个顶点,如果存在,则选取的边会构成环路。 由于Kruskal算法每次选择权重最小的边,且这些边不会构成环路,所以最终得到的最小生成树肯定是具有最小权重的树。因此,Kruskal算法可以高效地找到图中的最小生成树。 总的来说,Kruskal算法是一种简单且高效的贪心算法,用于解决最小生成树问题。它的核心思想是选择权重最小的边,并保证选取的边不会构成环路,从而逐步构建最小生成树。 ### 回答3: Kruskal算法是一种用于构建最小生成树的贪心算法。其思想是通过不断选择边,将边逐渐添加至最小生成树中,直到最小生成树的边数达到图的节点数减一为止。 具体来说,Kruskal算法的步骤如下: 1. 将图中的所有边按照权重从小到大进行排序。 2. 创建一个空的最小生成树。 3. 循环遍历排序后的边,每次选择权重最小的边。 4. 判断选择的边是否存在于最小生成树中。如果不存在,将其加入最小生成树中;如果存在,则舍弃该边。 5. 重复步骤3和步骤4,直到最小生成树的边数达到图的节点数减一。 Kruskal算法的核心思想是通过选择边来逐步扩展最小生成树,并且保证选取的边不形成环路。在每次选择边时,判断是否会导致环路的出现,可以使用并查集进行高效的判断。只有当选取的边不会导致环路时,才将其加入最小生成树中。 Kruskal算法的时间复杂度取决于排序边的时间复杂度,通常使用快速排序等时间复杂度为O(ElogE)的排序算法。其中E为边的数量。而由于要判断选择的边是否会导致环路,需要使用并查集来进行高效的判断,其时间复杂度为O(VlogV),其中V为图的节点数。 总结来说,Kruskal算法是一种贪心算法,通过选择权重最小的边来逐步构建最小生成树。它的思想简单且易于理解,适用于性能要求不太苛刻的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值