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;
//并且把基准位置设置为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;
}
}