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");
        }
    }
}




  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔狠角色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值