常见排序
冒泡排序
思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要n-1
趟排序(比如10个数,需要9趟排序)
代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数。每趟过后,比较的次数都应该要减1
public void maoPao(){ int[] array=new int[]{6,2,3,4,5,7,9,8,1,0}; int len=array.length; //外层循环控制排序的趟数 for(int i=0;i<len-1;i++){ //内层循环控制当前趟数需要比较的次数 for(int j=0;j<len-1-i;j++){ //如果前一个数大于后一个数,就交换值,把大的数放后面 if(array[j]>array[j+1]){ int temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } for(int x:array){ System.out.print(x); } }
选择排序
思路:找到数组中最大的元素,与数组最后一位元素交换。当只有一个数时,则不需要选择了,因此需要n-1
趟排序
代码实现要点:两个for循环,外层循环控制排序的趟数,内层循环找到当前趟数的最大值,随后与当前趟数组最后的一位元素交换
public void xaunZe(){ int[] array=new int[]{6,2,3,4,5,7,9,8,1,0}; int len=array.length; //外层循环控制排序的趟数 for(int i=0;i<len-1;i++){ //定义初始最大值为array[0],每趟查找到的最大值的索引maxIndex int max=array[0]; int maxIndex=0; //内层循环找到当前趟数的最大值 for(int j=0;j<len-i;j++){ if(array[j]>max){ max=array[j]; maxIndex=j; } } //将最大值和最后一个值交换,最大值放在最后 array[maxIndex]=array[len-1-i]; array[len-1-i]=max; } for(int x:array){ System.out.print(x); } }
快速排序
思路:在数组中找一个元素(节点),比它小的放在节点的左边,比它大的放在节点右边。一趟下来,比节点小的在左边,比节点大的在右边。不断执行这个操作….
代码实现:支点取中间,使用L和R表示数组的最小和最大位置。不断进行比较,直到找到比支点小(大)的数,随后交换,不断减小范围。递归L到支点前一个元素(j)。递归支点后一个元素(i)到R元素
//快速排序 public static int[] kuaiSu(int[] array,int l,int r){ int i=l; int j=r; //定义支点为中间点 int mid=array[(l+r)/2]; while (i<=j){ //左半边查找,直到找到比mid大的值,结束循环 while (array[i]<mid){ i++; } //右半边查找,直到找到比mid小的值,结束循环 while (array[j]>mid){ j--; } //此时找到 左边比mid大的值,右边比mid小的值,进行交换 if(i<=j){ int temp=array[i]; array[i]=array[j]; array[j]=temp; i++; j--; } } //上面的while保证了第一趟排序时,左边的值比mid小,右边的值比mid大,但是左右两边的数仍是无序的,需要调整mid的值,缩小范围继续比较、交换 //“左边”做排序,直到剩下一个数 if (l<j){ kuaiSu(array,l,j); } //“右边”做排序,直到剩下一个数 if (i<r){ kuaiSu(array,i,r); } return array; }
二分查找
public void search(){ int find=5; int[] array=new int[]{1,3,5,7,9,11,13,15,17}; int s=0; int e=array.length-1; int m; while (s<=e){ m=(s+e)/2; if(find>array[m]){ s=m; } if(find<array[m]){ e=m; } if(find==array[m]){ System.out.println(m); break; } } }