Java底层部分:在数组中插入一个值,冒泡排序法,选择排序法,快速排序法,二分查找

1.在数组中插入一个值 :

在一个有序的数组中,插入一个数,保证数组依然有序

public class InsertDemo{

        public static void main(String [] args ){

                // 源数组

                int [] oldArr ={23,34,56,58,87};

                // 新数组

                int [] newArr = new int [ oldArr.length+1 ];

               

                // 【 2 】将源数组中的元素依次赋到新数组中

                for ( int i =0; i < oldArr . length ; i ++){

                      newArr [ i ]= oldArr [ i ];

               }

                int number =100;

                int index = newArr . length -1; // 用于记录合适索引

               // 【 3 】找合适的位置

                for ( int i =0; i < oldArr . length ; i ++){

                    if ( oldArr [ i ]> number ){

                                index = i ;

                                break ;

                        }

               }

               

               // 【 4 】移动位置

                for ( int i = newArr . length -1; i > index ; i --){

               

                        newArr [ i ]= newArr [ i -1];

               }

                // 【 5 】将新元素插入到数组中

                newArr [ index ]= number ;

               TestArray.print( newArr );      

       }

}

2.冒泡排序

    N个数字来排队,两两相比,小靠前,外层循环N-1,内层循环N-1-i

import java.util.Arrays;

public class TestSort{

       public static void main(String [] args){

               int [] arr={43,55,35,4};

                Arrays.sort(arr); //只能进行升序排序(自然排序)

               TestArray.print(arr);

       }

}
 public class Sort{

       public static void bubbleSort(int [] array){

               for(int i=0;i< array.length-1 ;i++){  //控制比较的轮数

                       for(int j=0;j< array.length-1-i ;j++){  //每轮比较的次数

                               if( array[j]>array[j+1] ){

                                               //交换

                                               int temp=array[j];

                                               array[j]=array[j+1];

                                               array[j+1]=temp;
                           
                               }

                       }

               }

               return;// array;

       }

}

3.选择排序法

//选择排序
//原理:每次都找到当次最大的数,按大小顺序依次放入数组相应位置
//比如:第一次先找到最大的数并记下其位置,如果其不在数组第一位,
//则将其与第一位交换,使最大数置于第一位
//第二次再循环查找第二大的数并记下其位置,如果其不在数组第二位,
//则将其与第二位交换,使最大数置于第二位
//依次类推.........................................
//第i次再循环查找第i大的数并记下其位置,如果其不在数组第 i位,
//则将其与第 i位交换,使最大数置于第 i位

public static void chooseSort(int[] array ){

               for(int i=0;i< array.length-1 ;i++){  //轮数数

                       for(int j=i+1;j< array.length ;j++){  //每轮比较的次数

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

                                               int temp=array[i];

                                               array[i]=array[j];

                                               array[j]=temp;                       

                                }                     

                       }

               }

               return;

       }

4.快速排序法:

//说明——快速排序法:对系统随机生成的0~100内的十个整数,按从小到大的顺序打印
public class S1008{
    public static void main(String[] args){
        int array[] = new int[10];
        //用随机0~100的整数填充这个数组
        for(int i = 0; i < array.length; i++){
            array[i] = (int)(Math.random() * 100);
        }       
        System.out.print("快速排序前的数组:");
        show(array);
        System.out.print("第一次快速排序的数组:");
        quickSort(array, 0, array.length-1);
        show(array);
        System.out.print("快速排序完之后的数组:");
        recursive(array, 0, array.length-1);
        show(array);
    }

    // 打印数组
    public static void show(int array[]){
        for(int i = 0; i < 10; i++){
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

    // 快速排序
    public static int quickSort(int array[], int left, int right){
        int value = array[left];    // 选取数组最左边的值作为中枢值
        // 当左右指针未相遇时,循环排序
        while(left < right){
            // 将数组最右边的值取出与中枢值作比较,若比中枢值大,则指针左移,继续比较,
            // 直到找到比中枢值小的值,然后交换位置
            while(left < right && array[right] >= value){
                --right;
            }
            array[left] = array[right];
            // 找到之后,从右向左比较,找比中枢值大的数,找到之后就交换位置,找不到就指针右移
            while(left < right && array[left] < value){
                ++left;
            }
            array[right] = array[left];
        }
        // 一遍排序完成,将中枢值放回,并将此时中枢值所在的位置返回
        array[left] = value;
        return left;
    }

    // 递归调用
    public static void recursive(int array[], int left, int right){
        if(left < right){
            // 将中枢值所在位置存储于p变量中
            int p = quickSort(array, left, right);
            // 分别对中枢值左右两边进行递归调用
            recursive(array, left, p-1);
            recursive(array, p+1, right);
        }
    }
}

5.二分查找

1.二分查找又称折半查找,它是一种效率较高的查找方法。

2.二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列

3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。

4.实现:二分查找的实现用递归和循环两种方式

package other;
 
 public class BinarySearch {
     /*
      * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据
      */
     public static int binarySearch(int[] arr, int x) {
         int low = 0;   
         int high = arr.length-1;   
         while(low <= high) {   
             int middle = (low + high)/2;   
             if(x == arr[middle]) {   
                 return middle;   
             }else if(x <arr[middle]) {   
                 high = middle - 1;   
             }else {   
                 low = middle + 1;   
             }  
         }  
         return -1;  
     }
     //递归实现二分查找
     public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){    
            int midIndex = (beginIndex+endIndex)/2;    
            if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){  
               return -1;    
            }  
            if(data <dataset[midIndex]){    
                return binarySearch(dataset,data,beginIndex,midIndex-1);    
            }else if(data>dataset[midIndex]){    
                return binarySearch(dataset,data,midIndex+1,endIndex);    
            }else {    
                return midIndex;    
            }    
        }   
 
     public static void main(String[] args) {
         int[] arr = { 6, 12, 33, 87, 90, 97, 108, 561 };
         System.out.println("循环查找:" + (binarySearch(arr, 87) + 1));
         System.out.println("递归查找"+binarySearch(arr,3,87,arr.length-1));
     }
 }

猜你喜欢

转载自blog.csdn.net/wyqwilliam/article/details/81835060