Java数组的高级部分:冒泡排序+选择排序+直接插入排序+快速排序+折半查找

1.冒泡排序

(1)冒泡排序的思想

          两两比较,大的往后放,第一次比较完毕之后,最大值就出现在了最大索引处!然后依次这样比较,就可以得到一个排好序的数组.

(2)冒泡排序的规律

 1)一定是两两比较,大的往后放,第一次比较完毕,最大值在最大索引处

 2)第一次全部都比较,确定数组的最大值

  第一次比较,有0个元素不比

  第二次比较,有1个元素不比

  第三次比较,有2个元素不比

   ......

元素比较的次数:(数组长度-1)次

(3)冒泡排序算法

public static void BubbleSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {
			for (int y = 0; y < arr.length - 1 - x; y++) {
				if (arr[y] > arr[y + 1]) {
					int temp = arr[y];
					arr[y] = arr[y + 1];
					arr[y + 1] = temp;
				}
			}
		}
	}

2.选择排序

(1)选择排序的思想

          从0索引对应的元素依次和后面索引对应的元素进行比较,小的往前放,第一次比较完毕之后,最小值就出现在最小索引处,然后依次这样比较,就可以得到一个排好序的数组.

(2)选择排序的规律

 1)从0索引开始依次和后面索引对应的元素进行比较,小的数据往前放,最小值在最小索引处.

 2)用0索引对应的值依次和后面索引对应的值比较

用1索引对应的值依次和后面索引对应的值比较

......

arr.length-2索引对应的元素和arr.length-1索引对应的值比较

(3)选择排序算法

// 选择排序的功能
	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;
				}
			}
		}
	}

3.直接插入排序

(1)直接插入排序的思想

直接插入排序,是一种最简单的排序方法.他的基本操作是将一个记录插入到一个长度为m 的有序表中,使之仍保持有序,从而得到一个新的长度为m+1的有序列表.假设有一组元素{k1,k2...,kn},排序开始就认为k1是一个有序序列,让k2插入上述表长为1的有序序列,使之成为一个表长为2的有序序列,然后让k3插入上述表长为2的有序序列,使之成为一个表长为3的有序序列,以此类推,最后让kn插入表长为n-1的有序序列,得到一个表长为n的有序序列.

(2)举例

49,38,65,97,76,13,27  原始数据

[49],38,65,97,76,13,27 1引开始插入

[38,49], ,65,97,76,13,27

[38,49,65] 97,76,13,27

[38,49,65,97] 76,13,27

[38,49,65,76,97]13,27

[13,27,38,49,65,76,97],27

[13,27,38,49,65,76,97]

(3)直接插入排序算法

private static void insertSort(int[] arr) {
        //外层循环 是循环的轮次
        for (int i = 1; i <= arr.length - 1; i++) {
            //当前元素,如果小于我前面的元素,交换位置
            int j = i;
            while (j > 0 && arr[j] < arr[j - 1]) {
                int t = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = t;
                j--;
            }
        }
    }

4.快速排序

(1)快速排序的基本思想

分治法:比大小,再分区

1.从数组中取出一个数,作为基准数。

2.区:将比这个数大或等于的数全放到他的右边,小于他的数 全放到他的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

(2)实现思路

挖坑填数

1.将基准数挖出形成第一个坑。

2.由后向前找比他小的数,找到后挖出此数填到前一个坑中。

3.由前向后找比他大或等于的数,找到后也挖出此数填到前一个坑中。

4.再重复执行23两步骤。

例如对 5391672408 进行排序

(3)快速排序算法

public class QuickSort {
    //start 默认是0
    //end 是数组长度-1
    public void quickSort(int[] arr, int start, int end) {
        if (start < end) {
            //获取分区索引
            int index = getIndex(arr, start, end);
            //对左右两个分区 再进行同样的步骤 ,即是递归调用
            quickSort(arr, start, index - 1);//左半部分
            quickSort(arr, index + 1, end);//右半部分
        }
    }

    private int getIndex(int[] arr, int start, int end) {
        int i = start;
        int j = end;
        //定义基准数
        int x = arr[i];
        //循环
        while (i < j) {
            //从右往左比较
            while (i < j && arr[j] >= x) {
                j--;
            }
            //从右往左找到比基准数小的数了后,填坑
            if (i < j) {
                //把这个数填到上一个坑位
                arr[i] = arr[j];
                //让 i++;
                i++;

            }

            //从左往右找
            while (i < j && arr[i] < x) {
                i++;
            }
            // 找比基准数大的数,找到后填坑
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        //当上面的循环结束后把基准数填到最后一个坑位,也就一基准数为界,分成了左右两部分
        arr[i] = x; //把基准数填进去
        return i; //返回基准数所在位置的索引
    }

}

5.折半查找

(1)前提:一定是数组中的元素有序的!

(2)折半查找的中心思想:

           直接将数组元素减半,方便开发者使用,计算出中心索引,大了左边找,小了右边找.

(3)核心思想:

   A:定义最小索引和最大索引
   B:计算中间索引
   C:中间索引对应的元素和需要查找的元素比较
       相等,直接返回中间索引
       不相等:
              大了,左边找  max = mid -1 ;
              小了,右边找  min = mid + 1 ;
   D:重新计算中间索引 ,回到B继续查找

(4)折半查找算法

public static int search(int[] arr,int value) {
		//1)定义数组中的最小索引和最大索引
		int min = 0 ;
		int max = arr.length -1 ;
		
		//2) 计算出中间索引
		int mid = (max+min)/2 ;
		
		//3)拿中间索引对应的元素和需要查找的元素进行比较
		//如果相等,返回
		while(arr[mid]!=value) {
			//不相等
			if(arr[mid] >value) {
				 max = mid -1 ;
			}else {
				 min = mid + 1 ;
			}
			
			//如果这value在数组中找不到,找不到返回-1
			if(min>max) {
				return -1 ;
			}
			
			//重新计算出中间索引
			mid = (max+min)/2 ;
		}
		return mid ;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值