Java常见算法示例

算法:    排序算法的基本算法(三种)

冒泡:(每轮排序获取到一个最大值,所以每轮减去排序的次数,-1是防止越界)

    每相邻的两个数据比较,如果第一个比第二个大,就交换


public staticvoid bubbleSort(int []datas){
       for (int i = 0; i <datas.length-1;i++) {//排序的次数
          for (int j = 0; j<datas.length-i-1; j++) {//每轮的比较
             if(datas[j]>datas[j+1]){
                 int temp=datas[j];
                 datas[j]=datas[j+1];
                 datas[j+1]=temp;
             }
          }
       }
    }


选择 :(中)

遍历所有数据找到最小数据的下标,遍历到的数据和最小下标数交换


publicstaticvoid selectSort(int[] datas) {
    for (int i = 0; i < datas.length - 1; i++) {
       int min = i;//内循环获取最小数的下标,第一次默认最小的i
       for (int j = i + 1; j < datas.length; j++) {//忽略比较过的值
          if (datas[min] > datas[j]) {
              min= j;  
           }
       }//将最小数据和遍历到的数交换位置
       int temp = datas[i];
       datas[i] = datas[min];
        datas[min]= temp;
    }
}

插入:(高)

从第二个数据开始依次向前比较.如果发现比自己大,该大的往后瞬移,将大的数插入到他本身的后面;

publicstaticvoid insertSort(int datas[]) {
  int i=0;//第二个数开始遍历
  int j=0;
    for (i = 1; i < datas.length; i++) {
       int temp = datas[i];//向前比较
       for (j = i - 1; j >= 0; j--) {
          if (datas[j] > temp) {//比较到大的数据就后移
              datas[j+ 1] = datas[j];
           }else { 
             break;
          }                                                                            
       }
       //判断 j == -1或者 就是第一个小于等于temp数据的位置
       datas[j + 1] = temp;
    }
}

快速排序算法:


publicstaticvoid quickSort(int datas[], int start,int end) {
       if (start >= end) {
          return;
       }else {
          int middle =findMiddle(datas, start,end);
          quickSort(datas, start, middle- 1);
          quickSort(datas, middle + 1,end);
       }
    }
    privatestaticint findMiddle(int datas[],int start,int end) {
       int temp = datas[end];//参照物
       int left = start - 1;
       int right = end;
       while (true) {
          // 1.从左边依次找数据,找到第一个比参照大的数据
          while (++left < end && datas[left]<= temp);   
          if (left == end) {
             //参照物是最大值
             break;
          }
          // 2.从右边依次找数据,找到第一个比参数小的数据
          while (--right >= start && datas[right]>= temp);
          // 3,比较是否出现交叉(left和 right)
          if (left < right) {
             // 4,如果没有交叉,交换左右位置的数据
             int d = datas[left];
             datas[left] = datas[right];
             datas[right] = d;
          }else {
             // 5,如果出现交叉,交换左指针和参照物的值,结束
             int d = datas[left];
             datas[left] = datas[end];
             datas[end] = d;
             break;
          }
       }
       return left;
    }

二分查找:


int binarySearch(int[] a,int value){
        int low = 0; 
        int high = a.length-1; 
        while(low <= high){ 
                mid = (low+high)/2; //**
                if (a[mid] == value) 
                        return mid; 
                else if(a[mid] > value)
                        high = mid-1; 
                else 
                        low = mid +1; 
        } 
        return -1; 
}

汉诺塔问题:


public static void move(int panNum, char a,char b,char c) {
       if (panNum == 1) {
          System.out.println("盘:" + panNum +" 从 " + a +"柱移动 " + c +"柱");}else {
          move(panNum - 1, a, c, b);
          System.out.println("盘:" + panNum +" 从 " + a +"柱移动 " + c +"柱");
          move(panNum - 1, b, a, c);}}
递归:publicstaticint sum(int number) {
       if (number < 1) {
          thrownew RuntimeException("number must > 0"); }
       if (number == 1) {return 1;}else {
          return number +sum(number - 1);
       }}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值