您的位置:首页 > 编程语言 > Java开发

Java冒泡,快速,插入,选择排序^_^+二分算法查找

2015-10-29 18:35 651 查看
这段时间在学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();
       <span style="color:#FF0000;"> <strong>bf.find( 0, b.length-1, b, 8);</strong></span>
        /*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);
    <span style="font-size:14px;">        a[i]=t;
        }</span>
数组的初始化方式有静态和动态俩种,不能够混合使用,如
<span style="font-size:14px;"><strong><span style="color:#FF9966;">int[] b=new int[2]{1,2}; 将会报一个经典的错误。</span></strong></span>


2.二分算法查找。

二分算法的主要思想是:递归。一次没找到,将会不停的调用该函数,直到不满足条件或者找到该函数为止。

代码如下:

//二分算法!!!
class BinaryFind
{
    public void find(int left,int right,int a[],int val)
    {
        //找到中间的数midVal
       <span style="color:#FF0000;"> int midIndex=(left+right)/2;</span>
        int midVal=a[midIndex];
        
        if(left<=right)
        {       
            //当左边小于右边时执行以下操作:
            if(midVal>val)
            {
                //递归调用
                <span style="color:#FF0000;">find(left,midIndex-1,a,val);</span>
            }else if(midVal<val)
            {
                <span style="color:#FF0000;">find(midIndex+1,right,a,val);</span>
            }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];
           <span style="color:#FF0000;"> //将insertVal与前一个数比较</span>
            int index=i-1;
            while(index>=0&&insertVal<a[index])
            {
               <span style="color:#FF0000;"> //将a[index]向后移动</span>
                a[index+1]=a[index];
               <span style="color:#FF0000;"> //让index向前移动</span>
                index--;
            }
           <span style="color:#FF0000;"> //否则将insertVal插入到适当位置</span>
            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) {
           <span style="color:#FF0000;"> // 枢纽元素</span>
            System.out.println("枢纽元素是:" + key + ",low:" + low + ",high:" + high);
        
        while(i<j)
        {
            while(i<j&&key<=a[j])    
            {
                j--;
            }
            a[i]=a[j];
<span style="color:#FF0000;">//            int temp=a[j];这三行可以与前面一行互换,实现的功能相同。
//            a[j]=a[i];
//            a[i]=temp;</span>
            while(i<j&&key>=a[i])
            {
                i++;
            }
            a[j]=a[i];
下面标红三行与上面一行功能相同
<span style="color:#FF0000;">//            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);
    }
   }
  }

 



</pre> <pre>
快速排序值得注意的地方为,在主函数中调用方法要注意数组越界的问题。

即 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++){
            int min=i;
            for(int <span style="color:#FF0000;">j=i+1</span>;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;<span style="color:#FF0000;">j<a.length-1-i</span>;j++){           <span style="font-size:14px;"><strong>    a.length-1-i是因为最后的i个元素已经有序。</strong></span>

            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++){
            <span style="color:#FF0000;">System.out.print(i+"*"+j+"="+i*j+"\t");</span>
            
            }
        System.out.print("\n");
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: