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

来源:互联网 发布:windows pyqt5 安装 编辑:程序博客网 时间:2024/05/29 14:27

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;//并且把基准位置设置为iindex=i;//检索右边while(arr[j]>=value&&i<j){j--;}//档右边有比基准数小的时候就做交换arr[index]=arr[j];//把基准位置设置为jindex=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){//如果比较的值比中间值小  那么就从左边找returnfind(left, index-1, arr, value);}else{//如果比较的值比中间值大  那么就从右边找returnfind(index+1, right, arr, value);}}}//如果没有那么就返回-1return -1;}}




0 0
原创粉丝点击