[img]
下面的
选择排序1()这个方法
是我自己写的。虽然结果不尽人意但是思想还是不错的。希望能带动思考
第一步:跟普通的选择排序区别在于这个排序机一次性记录两个连续的角标。这样的话外层循环 每次的遍历就能够减少到原来的1/2左右;一次遍历就能找到最小的两个数。下面是详细步骤
1.定义数组封装方法
a:明确返回类型:对遍历后的集合 我们在方法体内打印出来辨别是否排序正常不需要排序所以把返回类型定义为void :
b:明确参数列表:在这里我们是对数组进行从小到大遍历,只需要一个数组就可以了 int[] arr
第二步: .建立for(int i;i<arr.length-2;i=i+2)循环在循环体内声明两个变量temp1,temp2记录住arrarr[i=1];比较这两个数的大小。再定义两个记录住角标因为循环一次能够比较两个数所以将循环的角标i一次自加2;
第三步:建立内层循环for();遍历集合将集合中最小的两个数的值记录下来和角标记录下来;
待循环完毕
对记录的两个最小值于i,i+1进行替换,
就这样循环下去;
下面是代码
2.比较它们的大小。小的用temp1记录大的用temp2记录,
3
- public static void main(String[] args) {
- int[] arr = {98,76,45,68,90,79,88,99,84,54,55,47,60,94,54,50,98,98,23,23,45,21,};
- int a = 0;
- for (int i = 0; i < arr.length; i++) {
- a++;
- }
- System.out.println(a+"\n\r");
- long a1 = System.currentTimeMillis();
- 选择排序(arr);
- long a2 = System.currentTimeMillis();
- 选择排序1(arr);
- long a3 = System.currentTimeMillis();
- if((a3-a2)>(a2-a1)){
- System.out.println("真");
- }else{
- System.out.println("假");
- }
- }
- public static void 选择排序(int[] arr){
- for(int i = 0 ; i < arr.length-1; i++){//i1 j 2
- int temp = arr[i];
- int index = i;
- for(int j = i +1;j < arr.length;j++){
- if(temp > arr[j]){
- temp = arr[j];
- index = j;
- }
- }
- arr[index] = arr[i];
- arr[i] = temp;
- }
- for(int i = 0 ;i<arr.length;i++){
- System.out.println(arr[i]);
- }
- }
- public static void 选择排序1(int[] arr){//超级优化
-
-
- for (int i = 0; i < arr.length-2;i = i + 2) {
- int temp1 = arr[i];
- int temp2 = arr[i+1];
- if(temp1 > temp2){
- temp1 = temp1+temp2;
- temp2 = temp1 - temp2;
- temp1 = temp1 - temp2;
- }
- int index1 =i , index2 =i+1;
- for (int j = i+2; j < arr.length; j++) {
- if(arr[j] < temp1){
- temp2 = temp1;
- index2 = index1 ;
- temp1 = arr[j];
- index1 = j;
- }else if(arr[j]<temp2){
- temp2 = arr[j];
- index2= j;
- }
- }
- arr[index1] =arr[i];
- arr[index2]= arr[i+1];
- arr[i] = temp1;
- arr[i+1]= temp2;
- }
- for (int i = 0; i < arr.length; i++) {
- System.out.println(arr[i]);
- }
- }
复制代码
[/img] |
|