问题一:找出最大值(最大或最小)
法一:用一个中间变量(默认是a[0])与数组每一个值比较,大的就赋值给中间变量
法二:找出最大值的下标,用一个下标变量(默认‘0’)与数组的每个值比较,大的就赋该值的下标给变量
问题二:数组的查找操作。(二分法的应用:对于有序的序列)
练习:有一个有序的数组,想要将一个元素插入到该数组中,
还要保证该数组是有序的。如何获取该元素在数组中的位置。
即在[1,3,6,8,9],插入一个7,而且保持有序
1 //利用二分法查找 2 //二分法:重点以中间值开始比较,key大的话以中间值后一位为起点开始查找,相反类推 3 //key小的以中间值前一位为起点开始找 4 public static int halfSearch(int[]arr,int key) 5 { 6 //设置要查询范围的首和尾的下标 7 int s=0,e=arr.length-1; 8 //设一个中间值下标,默认-1 9 int h; 10 //当首小于尾时才循环,没有循环次数要求。所以用while 11 while(s<=e) 12 { 13 //中间变量下标, 14 h=(s+e)/1; 15 if(arr[h]<key) 16 { 17 s=h+1;//必须+1,以此为起点 18 //System.out.println(h); 19 } 20 else if(arr[h]>key) 21 { 22 e=h-1;//必须-1,以此为终点 23 } 24 else if(arr[h]==key) 25 { 26 //第三种情况,两者相等,则跳出循环 27 return h; 28 } 29 //System.out.println("dd"); 30 } 31 //这里必须是s,不是h,因为while循环里一种情况是arr[h]==key,而另一种情况就是下面的 32 return s; 33 }
问题二:排序(从小到大)
Java排序方法:1.冒泡排序。2.选择排序。3.插入排序。4.快速排序。
1.冒泡排序法:
1 //冒泡排序法:从a[0]开始,每个相邻的数比较,较大时,两者交换。 2 //第一次将最大值交换到了最后一位,第二次交换到倒数第二位,以此类推 3 //这里要从小到大排序 4 public static void bubbleSort(int[]arr) 5 { 6 //首先一定是两次for循环 7 for(int i=1;i<arr.length;i++) 8 { 9 for(int k=0;k<arr.length-i;k++) 10 { 11 //交换要用到中间变量 12 int tmp; 13 if(arr[k]>arr[k+1]) 14 { 15 tmp=arr[k+1]; 16 arr[k+1]=arr[k]; 17 arr[k]=tmp; 18 } 19 } 20 } 21 }
2.选择排序
1 //选择排序法:找出最大值,放在最后一位,再从剩下的数找最大值,以此类推 2 //第一次循环,从0到n,用下标找出最小值,然后与最后一位(n)交换, 3 //第二次循环,从0到n-1,找出最小值再与(n-1)位交换,以此类推 4 //首先想到两次for循环!!! 5 //这里是从大到小排列, 6 public static void selectSort(int[]arr) 7 { 8 for(int i=1;i<arr.length;i++) 9 { 10 //默认下标为0,每一次都从0开始与后面比较 11 int min=0; 12 13 for(int k=0;k<arr.length-i;k++) 14 { 15 //找出最小值 16 if(arr[k+1]<arr[min]) 17 min=k+1; 18 } 19 //循环完后找出了最小值的下标 20 //与最后一位交换!!(交换必须想到用中间变量!!) 21 //System.out.print(arr[min]+"\t"); 22 //中间变量用于交换 23 int tmp; 24 tmp=arr[arr.length-i]; 25 arr[arr.length-i]=arr[min]; 26 arr[min]=tmp; 27 } 28 }
3.插入排序
1 //插入排序法:以第一个数为始点,拿后面的第二个数比较,较大插入到它的后面, 2 //否则前面,第三个数开始与前面的第二个比较,直到交换到比前面的数大 3 //这里的插入实际就是交换值(位置) 4 //这里从小到大排序 5 public static void insertSort(int[]arr) 6 { 7 //进行n-1次的交换 8 for(int i=1;i<arr.length;i++) 9 { 10 //从第一个和第二个开始比较插入 11 //比较次数依次增加 12 int tmp; 13 for(int k=i;k>0;k--) 14 { 15 //这里是从最后面的那个元素即i开始与前面比较的 16 if(arr[i]<arr[k-1]) 17 { 18 //实现交换 19 tmp=arr[i]; 20 arr[i]=arr[k-1]; 21 arr[k-1]=tmp; 22 //注意交换后,i即下标要改为交换后的位置的下标即k-1 23 i=k-1; 24 } 25 //如果刚好最后一个大于倒数第二个,则不必循环了 26 else break; 27 } 28 } 29 }
4.快速排序
//快速排序法(挖坑填数+分治法): public static void quikSort(int []arr) { }
时间: 2024-11-06 15:59:42