Java主要算法

一、排序:

  1、冒泡排序Bubble Sort

原理:比较相邻的元素,小的值往前移

第一层for:控制执行轮数,长度-1

for(int i=0;i<a.length-1;i++)

第二层for:比较大小,交换位置

for(int j=0;j<a.length-1;j++){

1、比较大小

2、交换位置

}

2、选择排序

原理:每次从现有数据里挑出一个最小的直接放在最前面,以此类推

根据下标进行比较

for(int i=0;i<a.length-1;i++){

for(int  j=0;j<a.length;j++){

    if(a[i]>a[j]){

          int temp=a[j];

              a[j]=a[i];

             a[i]=temp;

}

}

}

3、插入排序算法

原理:没插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置。

(每次插入一个数都要对原来排序好的那部分序列进行重新的排序)

3.1 直接插入排序

思路:新插入一个数据的时候,排序过后的数组都是从小到大排序好的,所有我们需要从后往前查找,直到找到比我们要插入的数字还小的值。这个时候我们需要一个变量j作为标识

for(int i=1;i<a.length;i++){

  int temp=a[i];

  int j;

  for(j=i-1;j>=0;j--){

     if(a[j]>temp){

          a[j+1]=a[i];

}else{

     break;

}

}

a[j+1]=temp;

}

4、快速排序Quicksort

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。以此达到整个数据变成有序序列。

排序流程:

  1. 设定一个分界值,通过该分界值将数组分成左右两部分
  2. 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值
  3. 左边和右边的数据可以独立排序。左侧的数组数据,又取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧同理
  4. 重复上述过程,递归的执行。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

5、归并排序

原理:建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个自序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

public static int[] sort(int[] nums, int low, int high) {

int mid = (low + high) / 2;

 if (low < high) {

      // 左边

       sort(nums, low, mid);

     // 右边

      sort(nums, mid + 1, high);

     // 左右归并

      merge(nums, low, mid, high);

}

 return nums;
}

 

二、排列组合:

1、二分查找

算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需要是有序不重复。

思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

public class DichotomySearch {
       public static void main(String[] args) {
           int[] arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 };
           System.out.println(search(arr, 12));
           System.out.println(search(arr, 45));
           System.out.println(search(arr, 67));
           System.out.println(search(arr, 89));
           System.out.println(search(arr, 99));
       }
     
       public static int search(int[] arr, int key) {
           int start = 0;
           int end = arr.length - 1;
           while (start <= end) {
               int middle = (start + end) / 2;
               if (key < arr[middle]) {
                   end = middle - 1;
               } else if (key > arr[middle]) {
                   start = middle + 1;
               } else {
                   return middle;
               }
           }
           return -1;
       }
    }

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值