插入排序算法&对数器
基本思想:
每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。
算法实现:
直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止
具体,在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。插入排序是简单排序算法中,效率最高的排序而且是稳定的,尤其是样本小而且基本有序的时候效率比较高。简单排序有冒泡、选择、插入。
平均时间复杂度 |
空间复杂度 |
稳定性 |
O(n2 ) |
O(1) |
稳定 |
实现代码:
package Sort;
public class InsertionSort {
public static void main(String[] args) {
int[] arr={12,5,6,8,24,75,89,34,2,66};
sort(arr);
System.out.println("最终排序结果为:");
print(arr);
}
static void sort(int arr[]){
for(int i=1;i<arr.length;i++){//抽出第i张牌,从第二张牌开始插
for(int j=i;j>0;j--){//把第i张牌插到前面去
if(arr[j]<arr[j-1])//如果当前值比前一项小就往前插
exchange(arr,j,j-1);
}
}
}
static void print(int arr[])//封装函打印函数
{
for(int k=0;k<arr.length;k++)
{
System.out.print(arr[k]+" ");
}
}
static void exchange(int arr[],int i,int j)//封装交换函数
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
运行结果:
对数器的思想
对数器:利用系统产生多个随机样本,将系统排序的结果和自己写的程序输出结果进行比对,判断是否正确。对数器类文件和插入排序类文件要建在同一个包下。以下我利用对数器对已经写好的插入排序算法进行判断:
对数器程序:
package Sort;
import java.util.Arrays;//导入JAVA自带排序算法的包
import java.util.Random;//导入随机函数包
/*对数器:利用系统产生多个随机样本,将系统排序的结果和自己写的程序输出结果进行比对,判断是否正确。
* */
public class DataChecker {
//利用Random随机生成1000个10000以内的任意整数,并输出一个数组
static int[] generateRandomArray(){
Random r=new Random();
int[] arr=new int[10000];
for(int i=0;i<arr.length;i++){
arr[i]=r.nextInt(10000);
}
return arr;
//这时得到长度为10000的数组,里面装的时,随机产生的数
}
static void check(){
int[] arr=generateRandomArray();
int[] arr2=new int[arr.length];//对随机数组arr进行拷贝
System.arraycopy(arr,0,arr2,0,arr.length );
Arrays.sort(arr);// 系统对arr数组进行排序
InsertionSort.sort(arr2);//自己写的算法进行排序
boolean same=true;//对比自己算法与系统自带排序算法是否一致
for(int i=0;i<arr2.length;i++){
if(arr[i]!=arr2[i])
same=false;
}
System.out.print(same==true ? "right":"wrong");
}
public static void main(String[] args) {
check();//调用检查函数
}
}
运行结果:
由对数器的结果可以知道,我们写的插入排序算法是正确无误的。
OK,简单排序算法(冒泡、选择、插入)写完了,下期可能更新希尔排序。
https://www.cnblogs.com/wildpointer/
ColorC1Troupe
万 物 皆 可 递 归