Java-数组排序之冒泡排序、选择排序、折半查找

冒泡排序
核心思想:相邻两个数比较大小,然后换位

public static void main(String[] args) {
    int[] name = new int[] {12,51,34,29,54,64,23};
//  Arrays.sort(name);//系统的排序
//  System.out.println(Arrays.toString(name));
    //升序排列
//for (int j= 1; j < name.length; j++)
//{
//  for (int i = 1; i <= name.length-j; i++) 
//{
//  if (name[i]<name[i-1]) 
//  {
//      int temp = name[i-1];
//      name[i-1] = name[i];
//      name[i] = temp;
//  }
//}
//}
    int[] array = new int[] {3,2,5,1};
    //外层循环控制比较的趟数,内存循环控制
    for (int i = 0; i < array.length-1; i++)
    {
        //内循环次数-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;
            }
        }
    }
//System.out.println(Arrays.toString(array));

System.out.println(Arrays.toString(sort(name)));
}
//封装一个函数进行排序
//这里传入的数组,是将原数组的地址传入,是地址的传递,根据地址来修改原来数组里面的元素的位置
//这时sort函数中就是对原数组进行了操作
public static int[] sort(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;
}

选择排序:
* 选择排序的核心:选择一个数与下一个数进行比较,用这个数和数组中的每一个数都进行一次比较,
* 一般就选第0个数,然后交换位置

public static void main(String[] args) 
{
    int[] array = new int[] {6,5,4,3,2,1};
    //外循环-1,是因为最后一个数不需要比较,所以循环的次数要-1
    for (int i = 0; i < array.length-1; i++) {
        //内循环,j的初始值要从1开始,
        //j =1+i是因为每次重新开始比较的时候,都会少比较一次
        for (int j = 1+i; j < array.length; j++) 
        {
            //
            if (array[i]>array[j]) 
            {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    System.out.println(Arrays.toString(array));  
}

折半查找
* 前提:需要一个有序的数组(通过最大小标和最小下标的移动来比较大小)

public static void main(String[] args) {
    int[] array = new int[] {3,6,8,11,13,19,25};
    int a = 25;
    int first = 0;
    int last = array.length-1;
    int num = (last+first)/2;
while(a != array[num])//如果中间角标带入数组与要找的值相等,在循环结束
{
    if (a<array[num])
    {
        last = num - 1;
    }else if (a>array[num]) 
    {
        first = num + 1;
    } 
    //重复折半的操作
    num = (last + first)/2;
    //判断如果数组中没有这个数,会造成死循环
    if (first > last) //这里说明没有找到这个数,需要停止循环
    {
        num = -1;
        break;
    }
}
System.out.println("数的下标是" + num);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值