插入排序_快速排序_二叉查找法

本文详细介绍了插入排序、快速排序的原理及实现过程,并通过示例讲解了二分查找法的应用场景与步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.插入排序:

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法。插入排序法的大致步骤是这样的:1.首先将数组分成一个有序表和无序表,假如数组有n个元素,那么一开始将数组的第一个元素作为有序表,那么2~n个元素则为无序列表。2.接下来就从第二个元素开始和有序列表的最后一个元素开始比较,如果比最后一个元素小那么就将最后一个元素往后移一位。如果比最后的值大那么就直接插入到当前比较的位置3.按照此方法一直作比较……..举例说明:假如我们的数组如下6,2,4,1,5

1)一开始有序列表为 6    无序列表为 2 4 1 5

2)然后将2拿出来比较,检索索引指向前面的一个数也就是6, 2<6 就将6后移,检索索引往前继续找,此时索引小于0那么直接将2插入到检索索引所在位置,那么当前的数组为2 6           4 1 5

3)接下来将4拿出来作比较,检索索引指向6,4<6,那么将6往后移动以为数组为2 6  6(移动过来的6覆盖了原先的4) 1  5,那么索引往前移动一位4>2,那么就直接将4放到当前检索索引的位置。数组为 2 4 6       1 5

4)接下来的步骤循环第三步骤即可。

Java代码实现如下:


package com.yd.arr;

import java.awt.Insets;

//插入排序类
public class InsertSort {
	//这个是程序的入口
	public static void main(String[] args) {
		int[] arr={6,2,4,1,5,9,43,2,6,9,5,43};
		InsertSort insertSort=new InsertSort();
		arr=insertSort.sort(arr);
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+"\t");
		}
	}
	//插入排序的算法实现
	public int[] sort(int[] arr){
		//首先将第一个数当作有序序列中的数
		//那么即从第二个数开始比较  并且定义一个变量存储当前作比较的数
		int value=0;
		//定义开始比较的位置
		int index=0;
		//从第二个数开始循环将数放到有序表中
		for(int i=1;i<arr.length;i++){
			//将当前的值存入到value中
			value=arr[i];
			index=i-1;
			//接下来就将我们的基准值和有序数列里面的书作比较
			while(index>=0&&value<arr[index]){
				arr[index+1]=arr[index];
				index--;
			}
			//一旦条件不满足那么就开始插入基准值
			arr[index+1]=value;
		}	
		return arr;
	}
}

2.快速排序:一趟快速排序的算法是

1)找到数组中中间的元素value,和中间元素的索引index

2)设置索引ij分别指向数组的头和尾

3)从ii++)向后检索,一旦遇到比value大的止就将第i个元素和第index元素交换,并且inde=i因为index始终指向被比较的元素

4)从jj--)向前检索,一旦遇到比value小的值就将第j个元素和第index元素交换,并且inde=i因为index始终指向被比较的元素

5)当i==j那么说明一趟排序结束在value左边的值小于valuevalue右边的值大于value

6)再将value左边和右边的数组重复1~5步骤既是快速排序

package com.yd.arr;

//快速排序的类
public class QucikSort {
	//程序的入口
	public static void main(String[] args) {
		int[] arr={6,2,4,1,5,9,43,2,6,9,5,43};
		QucikSort qucikSort=new QucikSort();
		qucikSort.quick(0, arr.length-1, arr);
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+"\t");
		}
	}
	//快速排序的方法  
	/**
	 * left:是比较数组的左边
	 * right:是比较数组的右边
	 * arr:是比较的数组
	 * */
	public void quick(int left,int right,int[] arr){
		//递归的出口
		if(left<right){
			//记录左右检索索引的位置
			int i=left;
			int j=right;
			//设置基准位置       也就是基准数的下标  用来记录基准数的位置的
			int index=(left+right)/2+1;
			int value=arr[index];
			//当两个检索索引没有相遇那么就一直往下做
			while(i<j){
				//首先检索左边
				while(arr[i]<=value&&i<j){
					i++;
				}
				//当左边有比基准数大的那么就做交换
				arr[index]=arr[i];
				arr[i]=value;
				//并且把基准位置设置为i
				index=i;
				//检索右边
				while(arr[j]>=value&&i<j){
					j--;
				}
				//档右边有比基准数小的时候就做交换
				arr[index]=arr[j];
				//把基准位置设置为j
				index=j;
				arr[j]=value;
			}
			//递归在快速排序剩下的左边和右边
			quick(left, i-1, arr);
			quick(i+1, right, arr);
		}
	}			
}

3.二叉查找法,前提是一个有序序列。首先我们找到序列的中间位置,将要找的数和中间位置的数值相比较,如果比中间值大那么就在中间值右边找,如果比中间值小那么就在左边找。然后重复上面的步骤,如果找到了就返回索引,如果没有找到就返回-1。

例如:3 5 6 7 9 10 33

在中间找9

1)首先确定中间值7,9比7大那么就在右边(9  10  33)找

2)然后确定中间值10,9比10小那么就在(9)中找

3)9和9相等那么就返回索引4

从上面的例子可以看出起步骤就是一个简单的递归调用

java代码如下:

package com.yd.search;

import org.omg.CORBA.SystemException;

import com.yd.sort.QucikSort;

/**
 * 功能:二分查找法
 * */
public class BinarySearch {
	//程序入口
	public static void main(String[] args) {
		int[] arr={6,2,4,1,5,9,43,2,6,9,5,43};
		//快速排序的方法
		QucikSort qucikSort=new QucikSort();
		arr=qucikSort.quick(0, arr.length-1, arr);
		for(int i=0;i<arr.length-1;i++){
			System.out.println(arr[i]);
		}
		BinarySearch binarySearch=new BinarySearch();
		int value=binarySearch.find(0, arr.length-1, arr, 44);
		System.out.println(value);
	}
	//查找方法 返回索引
	public int find(int left,int right,int[] arr,int value){
		//首先判断左是不是比右大
		if(left<=right){
			//获得中间值
			int index=(left+right)/2;
			if(arr[index]==value){
				//如果证号真好相等那么就直接返回当前的索引
				return index;
			}else{
				if(arr[index]>value){
					//如果比较的值比中间值小  那么就从左边找
					return	find(left, index-1, arr, value);
				}else{
					//如果比较的值比中间值大  那么就从右边找
					return	find(index+1, right, arr, value);
				}
			}
		}
		//如果没有那么就返回-1
		return -1;
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值