今天复习插入排序,下面是几个代码:
原始代码:
package com.sort;
import java.util.Random;
/**
* 算法感想:
* 1.算法的精妙之处在于限定
* 2.限定的好了,接下来就是一些操作,比如赋值操作等
* @author lingrp
*
*/
public class InsertSort {
//预留一个数组长度参数,为以后需要改变数组长度做扩充
public static int LENGTH=10;
public static void main(String[] args) {
int[] arr=new int[LENGTH];
initArr(arr);
System.out.println("原数组:");
displayArr(arr);
insertSort(arr);
System.out.println("排序后数组:");
displayArr(arr);
}
/**
* 遍历数组
* @param arr
*/
public static void displayArr(int[] arr) {
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
}
public static void insertSort(int[] arr) {
int temp=0;
for (int i = 1; i < arr.length; i++) {
temp=arr[i];
int j=i-1;
while(j>=0&&temp<arr[j])
{
arr[j+1]=arr[j];
j--;
}
//for语句可以省几行
/*
int j=i-1;
for(;j>=0&&temp<arr[j];j--)
arr[j+1]=arr[j];
*/
arr[j+1]=temp;
}
}
/**
* 通过随机数为一个int类型数组进行初始化赋值
* @param arr
*/
public static void initArr(int[] arr) {
Random rd=new Random();
for (int i = 0; i < arr.length; i++) {
arr[i]=rd.nextInt(arr.length);
}
}
}
优化代码:
package com.sort;
import java.util.Random;
/**
* 前言:
* 插入排序中,插入的移位是避免给不了的,那么能够优化的就是查找了
* 而在左边有序队列中要想优化可以考虑折半查找,这样时间复杂度O(log2 n),比线性的O(n)要优
* @author lingrp
*
*/
public class InsertBinarySort {
//预留一个数组长度参数,为以后需要改变数组长度做扩充
public static int LENGTH=10;
public static void main(String[] args) {
int[] arr=new int[LENGTH];
initArr(arr);
System.out.println("原数组:");
displayArr(arr);
insertSort(arr);
System.out.println("排序后数组:");
displayArr(arr);
}
/**
* 遍历数组
* @param arr
*/
public static void displayArr(int[] arr) {
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
}
public static void insertSort(int[] arr) {
int temp=0;
for (int i = 1; i < arr.length; i++) {
temp=arr[i];
int left=0;
int right=i-1;
int middle=0;
//折半查找
while(left<=right)
{
middle=(left+right)/2;
if(temp<arr[middle])
right=middle-1;
else
left=middle+1;
}
//移位
for (int j = i; j > left; j--) {
arr[j]=arr[j-1];
}
arr[left]=temp;
}
}
/**
* 通过随机数为一个int类型数组进行初始化赋值
* @param arr
*/
public static void initArr(int[] arr) {
Random rd=new Random();
for (int i = 0; i < arr.length; i++) {
arr[i]=rd.nextInt(arr.length);
}
}
}
另附一段折半查找:
package com.search;
public class BinarySearch {
public static void main(String[] args) {
int[] arr={0,1,2,3,4,5,6,7,8,9};
int searchNumber=10;
int index=binarySearch(arr,searchNumber);
System.out.println(index);
}
/**
* 返回查找到元素在数组中的下标,没有找到则返回-1
* @param arr
* @param searchNumber
* @return
*/
public static int binarySearch(int[] arr, int searchNumber) {
int begin=0;
int end=arr.length;
int middle=0;
while(begin<end)
{
middle=(begin+end)/2;
if(searchNumber<arr[middle])
end=middle-1;
else if(searchNumber>arr[middle])
begin=middle+1;
else {
return middle;
}
}
return -1;
}
}