1. 程式人生 > >Java冒泡,快速,插入,選擇排序^_^+二分演算法查詢

Java冒泡,快速,插入,選擇排序^_^+二分演算法查詢

這段時間在學Java,期間學到了一些排序和查詢方法。特此寫來和大家交流,也方便自己的日後檢視與複習。

1.下邊是Java的主類:

public class Get
{
    public static void main(String[] args)
    {    
        
        int len=10;
        int[] a=new int[len];
        
        for(int i=0;i<len;i++)
        {
            int t=(int)(Math.random()*10);
            a[i]=t;
        }
        
        //靜態初始化陣列
        //int[] b=new int[]{1,2};
//        動態初始化陣列:由下面看出動態初始化就是隻指定陣列的長度,由系統為陣列分配初始值。
        int[] b=new int[10];
    
//        int a[]={2,45,34,1,3,6,5,67,867,76};
//        int a[]={4,2,45,34,1,3,6,5,67,867,76};
        Insert is=new Insert();
        is.sort(a);
//        Bubble bub=new Bubble();
//        bub.bubblesort(a);
        Select sl=new Select();
        sl.sort(a);
//        Quick qc=new Quick();
//        qc.sort(a, 0, a.length-1);
        
        
        for(int i=0;i<a.length;i++){
            b[i]=a[i];
            System.out.print(b[i]+"  ");
        }
        
        BinaryFind bf=new BinaryFind();
       
        /*System.out.println("Hello World!");
        Fun f=new Fun(23,"李四");
        System.out.println("我的名字叫"+f.name);
        System.out.println("我的年齡為"+f.age);*/
    }
}
其中,以下程式碼將定義一個數組,並且將產生一組隨機數,存放在陣列a[]中:
int len=10;
        int[] a=new int[len];
        
        for(int i=0;i<len;i++)
        {
            int t=(int)(Math.random()*10);
           a[i]=t;
        }
陣列的初始化方式有靜態和動態倆種,不能夠混合使用,如
int[] b=new int[2]{1,2};將會報一個經典的錯誤。


2.二分演算法查詢。

二分演算法的主要思想是:遞迴。一次沒找到,將會不停的呼叫該函式,直到不滿足條件或者找到該函式為止。

程式碼如下:

//二分演算法!!!
class BinaryFind
{
    public void find(int left,int right,int a[],int val)
    {
        //找到中間的數midVal
      int midIndex=(left+right)/2;
        int midVal=a[midIndex];
        
        if(left<=right)
        {       
            //當左邊小於右邊時執行以下操作:
            if(midVal>val)
            {
                //遞迴呼叫
                find(left,midIndex-1,a,val);
            }else if(midVal<val)
            {
                find(midIndex+1,right,a,val);
            }else
            {
                System.out.println("已經找到該數,下標為:"+midIndex);
            }
        }else
        {
            System.out.println("找不到該數");
        }
    }
}

3.插入排序

插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2)

//插入排序!!!
class Insert
{
    public void sort(int a[])
    {
        for(int i=1;i<a.length;i++)
        {
            int insertVal=a[i];
          //將insertVal與前一個數比較
            int index=i-1;
            while(index>=0&&insertVal<a[index])
            {
                //將a[index]向後移動
                a[index+1]=a[index];
                //讓index向前移動
                index--;
            }
           //否則將insertVal插入到適當位置
            a[index+1]=insertVal;
        }
    }
}
謹記如果此判斷條件index>=0的等號忘記加,則,陣列中的第一個元素將不會參與排序!!!
while(index>=0&&insertVal<a[index])


4.快速排序!!!
//* 快速排序。
//* 思想:選定一個元素作為樞紐元素,將小於該元素的元素放到左邊,大於該元素的放到右邊。不斷重複此過程。
//* 直到最終形成一個有序的列表。
//* 下面的引數low,high就是可以支援一個數組的一個子區間進行排序。
//* 如果是整個陣列進行排序,則low=0,high=陣列.length-1。
//* @param data:要排序的陣列。
//* @param low:排序的起始位置
//* @param high:排序的結束位置。

class Quick
{
    public void sort(int a[], int low, int high){
        int i=low;
        int j=high;
        int key=a[low];
        
        if (low < high) {
           // 樞紐元素
            System.out.println("樞紐元素是:" + key + ",low:" + low + ",high:" + high);
        
        while(i<j)
        {
            while(i<j&&key<=a[j])    
            {
                j--;
            }
            a[i]=a[j];
//            int temp=a[j];這三行可以與前面一行互換,實現的功能相同。
//            a[j]=a[i];
//            a[i]=temp;</span>
            while(i<j&&key>=a[i])
            {
                i++;
            }
            a[j]=a[i];
//下面標紅三行與上面一行功能相同
//            int temp1=a[j];
 //            a[j]=a[i];
//            a[i]=temp1;</span>

               a[i]=key; 
             } 
            sort(a,low,i-1);
            sort(a,i+1,high);
    }
   }
  }

 
快速排序值得注意的地方為,在主函式中呼叫方法要注意陣列越界的問題。

即       Quick qc=new Quick();           qc.sort(a, 0, a.length-1);在傳遞實參的時候是a.length-1而不是a.length

5.選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。

//選擇排序!!!
class Select
{    int temp;
    public void sort(int a[]){
        for(int i=0;i<a.length-1;i++){
            
            for(intj=i+1;j<a.length;j++){
                 
                  將倆個元素進行比較
                 if(a[i]>a[j]){
                    temp=a[j];
                    a[j]=a[i];
                    a[i]=temp;
                }
            }
        }        
    }
}

6.氣泡排序

氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

//氣泡排序!!!
class Bubble
{    
    int temp;
  public void bubblesort(int a[]){    
    for(int i=0;i<a.length-1;i++){    

        for(int j=0;j<a.length-1-i;j++){  
               //a.length-1-i是因為最後的i個元素已經有序。

            if (a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
                
    }
  }
}



7.二維陣列
這是自己先前用來練手的二維陣列的使用方法,一起來看看吧。
//將一個矩陣倒置輸出!!!
class Array
{
    //int num[][];
    int  num[][]={
                {1,2,3},
                {4,5,6},
                {7,8,9}
                };
    public  void get(){
        System.out.println("原陣列為:");
        for(int i=0;i<=2;i++){
            for(int j=0;j<=2;j++){
                System.out.print(num[i][j]+"\t");
            }
            System.out.println("\n");
        }
        System.out.println("倒置後的陣列為:");
        for(int i=0;i<=2;i++){
            for(int j=0;j<=2;j++){
                System.out.print(num[j][i]+"\t");
            }
            System.out.println("\n");
        }
    
    }

}

8.99乘法表
先前學習的倆層迴圈,99乘法表  ^_^
//輸出99乘法表!!!
class Table
{
    public static void get(){
    for(int i=1;i<=9;i++){
        for(int j=1;j<=i;j++){
           System.out.print(i+"*"+j+"="+i*j+"\t");
            
            }
        System.out.print("\n");
        }
    }
}