2021-07-20

本文详细介绍了三种基本的排序算法——冒泡排序、选择排序和插入排序,包括它们的工作原理、优缺点及示例代码。同时,还探讨了二分查找法,强调其在有序列表中的高效性及其适用场景。这些基础知识对于理解数据结构和算法至关重要。
摘要由CSDN通过智能技术生成

**

Java数组排序和查找

**
1)冒泡排序

相邻的两个元素进行比较,如果符合条件换位。

特点:第一圈,最值出现在最后位。

优点:稳定。

缺点:慢,效率低,每次只能移动相邻两个数据。

示例:

<pre class="java" name="code">//冒泡排序

 public static void bubbleSort(int[] arr)

 {

  for(int x=0;x<arr.length-1;x++)//外循环控制比较次数

  {

   for(int y=0;y<arr.length-x-1;y++)//-x:让每一次比较的元素减少;-1:避免角标越界

   {

    if(arr[y]>arr[y+1])

    {

     int temp=arr[y];

     arr[y]=arr[y+1];

     arr[y+1]=temp;

    }

   }

  }

 }

 

 //对数组的输出进行了封装

 public static void printArray(int[] arr)

 {

  System.out.print("[");

  for(int x=0;x<arr.length;x++)//遍历数组

  {

   if(x!=arr.length-1)//如果不是数组中最后一个值

   {

    System.out.print(arr[x]+",");

   }else{

    System.out.println(arr[x]+"]");

   }

  }

 }

 

 public static void main(String[] args)

 {

  int[] arr={2,7,9,6,5,4,55,41};

  //排序前

  printArray(arr);

  //进行排序

  bubbleSort(arr);

  //排序后

  printArray(arr);

 }

2)选择排序

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

也就是先拿0角标位置与其他角标依次比较,最小的到0角标位置,在拿1角标位置与其他角标依次比较(0角标除外),最小的到1角标位置,以此类推比较。

特点:内循环结束一次,最值出现头角标位置上。

优点:移动数据的次数已知(n-1次);

缺点:比较次数多,不稳定。

示例:

//选择排序

 public static void selectSort(int[] arr)

 {

  for(int x=0;x<arr.length-1;x++)

  {

   for(int y=x+1;y<arr.length;y++)

   {

    if(arr[x]>arr[y])

    {

     //对位置进行置换

     int temp=arr[x];//定义一个临时容器

     arr[x]=arr[y];

     arr[y]=temp;

    }

   }

  }

 }

 

 //输出数组方法

 public static void printArray(int[] arr)

 {

  System.out.print("[");

  for(int x=0;x<arr.length;x++)

  {

   if(x!=arr.length-1)

   {

    System.out.print(arr[x]+",");

   }else

   {

    System.out.println(arr[x]+"]");

   }

  }

 }

 

 public static void main(String[] args)

 {

  int[] arr={2,4,6,3,7,8,9};

  //排序前

  printArray(arr);

  //进行排序

  selectSort(arr);

  //排序后

  printArray(arr);

 }

3)插入排序

插入排序:已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)

优点:稳定,快。

缺点:比较次数不一定,比较次数越多,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

//插入排序

 public static void insertionSort(int[] arr)

 {

  for(int x=1;x<arr.length;x++)

  {

   for(int y=x;(y>0)&&(arr[y]<arr[y-1]);y--)

   {

    int temp=arr[y];

    arr[y]=arr[y-1];

    arr[y-1]=temp;

    

   }

  }

 }

 

 public static void printArray(int[] arr)

 {

  System.out.print("[");

  for(int x=0;x<arr.length;x++)

  {

   if(x!=arr.length-1)

   {

    System.out.print(arr[x]+",");

   }else{

    System.out.println(arr[x]+"]");

   }

  }

 }

 

 public static void main(String[] args)

 {

  int[] arr={1, 3, 2, 5, 12, 123, 23, 2, 541, 1, 76, 76};

  //排序前

  printArray(arr);

  //进行排序

  insertionSort(arr);

  //排序后

  printArray(arr);

 }

**

查找

**
二分查找又称折半查找

优点:比较次数少,查找速度快,平均性能好;

缺点:要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

示例:

方式1

public static int halfSearch(int[] arr,int key){
 int min,max,mid;
 min = 0;//小
 max = arr.length-1;//大
 mid = (max+min)/2;//中
 
 while(arr[mid]!=key ){
    if(key>arr[mid])
       min = mid + 1;
    else if(key<arr[mid])
       max = mid - 1;
 
    if(min>max)
  return -1;
 
    mid = (max+min)/2;
 }
 return mid;
}

方式2

public static int halfSearch_2(int[] arr,int key){
 int min = 0,max = arr.length-1,mid;
 
 while(min<=max){
  mid = (max+min)>>1;//>>1相当与/2
  if(key>arr[mid])
       min = mid + 1;
  else if(key<arr[mid])
       max = mid - 1;
  else 
       return mid;
 }
 return -1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值