插入排序_快速排序_二叉查找法
来源:互联网 发布: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)设置索引i和j分别指向数组的头和尾
3)从i(i++)向后检索,一旦遇到比value大的止就将第i个元素和第index元素交换,并且inde=i因为index始终指向被比较的元素
4)从j(j--)向前检索,一旦遇到比value小的值就将第j个元素和第index元素交换,并且inde=i因为index始终指向被比较的元素
5)当i==j那么说明一趟排序结束在value左边的值小于value,value右边的值大于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;}}
- 插入排序_快速排序_二叉查找法
- Java冒泡,快速,插入,选择排序^_^+二分算法查找
- 排序_插入排序
- 排序_插入排序
- 8_排序二叉树插入
- 排序_快速排序
- 黑马程序员_数组、冒泡、选择、插入排序法,查找。
- 函数_内存结构_数组_排序_选择排序_冒泡排序_折半查找_插入排序_进制转换数组
- 分治法_快速排序
- 数据结构_插入排序
- C++_插入排序
- 03_插入排序
- 算法_插入排序
- 排序_查找算法
- java_排序_查找
- 算法_排序_插入排序
- 数据结构_快速排序
- C++_快速排序
- Ajax异步加载将返回的map解析在页面显示
- 解决PHP 输出csv文件中文乱码
- 自动生成dimens文件
- TangYuan之Ognl设计
- Contiki之初步
- 插入排序_快速排序_二叉查找法
- 关于ADT与SDK的问题
- iOS与javascript交互
- 大话数据结构7栈和队列1
- 一些有意思的VR设备介绍
- 102. Binary Tree Level Order Traversal
- Android系统权限和root权限
- HTTP协议详解
- 用NPOI操作EXCEL--生成下拉列表