排序----冒泡,选择,插入,二分查找

1.冒泡排序两两比较元素进行交换,这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名)

{array[0]同arrat[1]比较,若array[0]>array[1],两者换位

array[1]同array[2]比较,若array[1]>array[2],两个换位

array[length-2]同array[length-1]比较,若array[length-2]>array[length-1],两个换位},

{array[1]同arrat[2]比较,若array[1]>array[2],两者换位

array[2]同array[3]比较,若array[2]>array[3],两个换位

array[length-3]同array[length-2]比较,若array[length-3]>array[length-2],两个换位},

    /**
* 冒泡增序算法
* @param array
*/
public static void  bubblingSort(int[] array){
for(int i=0;i<array.length;i++){
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
swap(array,j,j+1);
}
}
}
}

private static void swap(int[] array,int x,int y){
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}
时间复杂度: O(N²),进行了(n-1)*(n-2)....=n*(n-1)/2次比较和约比较次数一半的交换次数(均况下),那么根据大O表示法时间复杂度为O(N^2)

2.选择排序每次选出当下索引应放的值

{array[0]同arrat[1]比较,若array[0]>array[1],两者换位

array[0]同array[2]比较,若array[0]>array[2],两个换位

array[0]同array[length-1]比较,若array[0]>array[length-1],两个换位},确定array[0]的值,即确定数组最小值并放到索引为0的位置

{array[1]同arrat[2]比较,若array[1]>array[2],两者换位

array[1]同array[3]比较,若array[1]>array[3],两个换位

array[1]同array[length-1]比较,若array[1]>array[length-1],两个换位},确定array[1]的值,即确定数组最小值并放到索引为1的位置

     /**
* 选择排序增序
* @param array
*/
public static void selectSort(int [] array){
for(int i=0;i<array.length;i++){
int index = i;
for(int j=i+1;j<array.length;j++){
if(array[j] < array[index]){
index = j;
}
}
if(i != index) swap(i,index,array);
display(array);
System.out.println();
}
}


public static void swap(int a,int b,int array[]){
int temp  = array[a];
array[a] = array[b];
array[b] = temp;
}
时间复杂度:O(N^2), 与冒泡排序相比减少了数组交换的次数

3.插入排序(插入排序的思想是数组是部分有序的,然后将无序的部分循环插入到已有序的序列中

 /**
* 插入排序升序
* @param array
*/
public static void insertSort(int [] array){
for(int out=1;out<array.length;out++){
int temp = array[out];//被标记的值或者说是当前需要插入的值
int in = out;
//如果轮循值大于被标记值则往后移
while( in > 0 && temp < array[in - 1]){
array[in] = array[in - 1]; 
in -- ;
}
//将被标记值插入最终移出的空位置
array[in] = temp;
}
}

时间复杂度:插入排序对随即顺序的序列的时间复杂度也为O(N^2),但是对于基本有序的序列进行排序时间复杂度为O(N)

4.数组查找,折半/二分法查找(前提要求数据序列呈现线性结构,即必须是经过排序的)

public class ArrayDemo
{
    public static void main(String[] args)
    {
        int[] arr = new int[]{2,5,8,10,16,22,24,27,30};
        int index = halfSearch(arr,24);
        System.out.println(index);
    }
    
    /**
    *@ author    Soul_Fighter
    *@ 功   能        折半查找
    *@ param        array
    *@ param        key
    *@ return        int
    */
    /*
    思路:折半查找
    1、定义三个角标变量,最大角标max,最小角标min,中间角标mid。
    2、定义一个循环,因为不确定第一次就能得出结果。这里用while循环比较好,因为只需判断一个条件arr[mid]是否等于key的值。即:arr[mid] != key。
    3、然后判断arr[mid]的值和key的值之间的关系。如果arr[mid]>key,则max = mid - 1;如果arr[mid] < key,则min = mid +1。中间值重新去值mid = (max+min)/2。
    4、因为min不能大于max的值,所以还要加一个判断。如果min<max程序继续,否则返回-1。
    */
    public static int halfSearch(int[] arr,int key)
    {
        int max,min,mid;
        max = arr.length - 1;
        min = 0;
        mid = (max+min)/2;

        while(arr[mid] != key)
        {
            if(arr[mid] > key)
                max = mid - 1;
            else if(arr[mid] < key)
                min = mid +1;

            if(min > max)
                return -1;
            mid = (max+min)/2;
        }
        return mid;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值