java各种算法

xiaoxiao2021-02-28  92

public static int[] getResult(int[] b) { int len = b.length; for(int i=0;i<len-1;i++) { for(int j=0;j<len-i-1;j++) { if(b[j]>b[j+1]) { int a=b[j]; b[j] =b[j+1]; b[j+1] = a; } } } return b; } 冒泡排序

//

1,首先最外层循环决定需要进行几轮比较,比如长度为n的数组,至少需要进行n-1轮比较。

2,里面的循环则是数组中的每一个数与后面的一个数进行比较,如果大小不等,则替换位置,里面每循环一次比较出当前多个数字中的最大值,并排在队末并且下一次循环所比较的次数会减少,因为决定了大小的数字不需要再次进行比较。

/** * 找出数组中的 最小值 */ public static int getMin(int[] a) { int min = a[0];//假设最小值为数组中的第一个元素。 for(int i=0;i<a.length;i++) { if(min>a[i])//如果最小值大于数组中的某一个数,则将该数赋值给最小值。 { min = a[i]; } } return min; }

快速排序:

/** * * 快速排序 * @param a 传入要排序的集合或者数组 * @param left 用于排序的左边指针 * @param right 用于排序的右边指针 */ public static void speedSort(int left,int right,int[] a) { if(left>right) return;//当坐标指针大于右边指针时,结束递归调用(此时排序的数仅有一个,就可以直接退出了。) int temp = a[left];//设置一个基准值,通常为集合第一个元素。 int length = a.length; int _left = left;//设置一个临时变量,我们可以叫它为左指针,从左到右扫描 int _right = right;//同理右指针,从右往左扫描 if(length>=2)//当数组长度大于等于2,排序才有意义。 { while(_left!=_right)//当坐标指针与右边指针不等时,即指向的不是同一个位置。 { //System.out.println("cccc"); while(_right>_left&&a[_right]>=temp)//当右指针位置 指向的数字小于基准数时,则退出循环,否则一直向左移动。 { _right--;// } while(_left<_right&&a[_left]<=temp)//当左指针位置 指向的数字大于基准数时,则退出循环,否则一直向右移动。 { _left++; } if(_left<_right)//左指针指向的数大于基准数,而右边指针的指向的数小于基准数,此时替换相应元素的位置 { int c = a[_left]; a[_left]=a[_right]; a[_right] = c; } } //再将基准数与此时指针指向的数替换位置,则,在基准数左边的为小于它的,右边为大于它的。 int d = a[_left]; a[_left] = a[left]; a[left] = d; //基准数左边与右边的数顺序还未定,需要递归调用此方法。 speedSort(left,_left-1,a);//排序剩余左边数 speedSort(_right+1,right,a);//排序剩余右边数 } }

选择排序:

思路:在一堆数中找出最小的数,放到第一个数的位置,然后再从剩下的数字中找出最小的数放到第二个,以此类推,最终可排序。

/** * 选择排序 */ public static void selectSort(int[] a,int j){//方法一,j的初始值传0 if(j==a.length) return; int min = Integer.MAX_VALUE; int k=-1; for(int i=j;i<a.length;i++) { if(min>a[i]) { min = a[i]; k =i; } } int c = a[k]; a[k] = a[j]; a[j] = c; selectSort(a,j+1); } public static void selectSort1(int[] a){//方法二 int k=-1;//最小数对应的序号 for(int n=0;n<a.length;n++) { int min = Integer.MAX_VALUE;//每次循环都将最小值重新赋值为Interger所能表示的最大值,已保证每次循环第一次比较能被替换 for(int i=n;i<a.length;i++) { if(min>a[i]) { min = a[i]; k =i; } } int c = a[k];//找到剩余数中的最小值,与第n个数进行替换。 a[k] = a[n]; a[n] = c; } }

下面为比较详细的图解。来自其他博友。

点击打开链接

转载请注明原文地址: https://www.6miu.com/read-29447.html

最新回复(0)