插入排序:
public void sort(){int in,out,temp;for(out=1;out<nElements;out++){temp = arr[out];in = out;while(in>0&&arr[in-1]>=temp){arr[in] = arr[in-1];//待插入的数据比其之前的数字大的右移,从小到大排序--in;//依次左移}arr[in] = temp;//直到遇到比temp小的,将temp插入}}
大多数情况下,插入排序是简单排序中最好的一种,时间复杂度仍为O(N^2),但在一般情况下比冒泡快一倍,比选择还要快一些。
先将下标为1的数组元素放入temp,从移走的元素(放到temp)处,向左比较:
将下标为1的数组元素放入temp:
从空处向左比较,为temp找合适的插入点:
outer右移,指向下一个待插入的元素,将其放入temp:
排序完成:
完整代码:
package TwoArray;/*** 插入排序 将待排序的一个一个放入temp,与所处位置之前的数值比较,一个个插入* 将数组下标1的值作为分界点,暂存在临时变量temp,temp依次与左边的比较若左边in的比其大,将左边比其大的依次右移,直到遇到比其小的腾出一个空位* 插入这个空位,in一直指向空位位置,out一直右移指向下一个待插入的元素。大多数情况下,插入排序是简单排序中最好的一种,时间复杂度O(N^2)* @author zhic**/
public class InsertionSort {int[] arr;int nElements;public InsertionSort(int max){arr = new int[max];nElements = 0;}public void insert(int value){arr[nElements] = value;nElements++;}public void display(){for(int i=0;i<nElements;i++){System.out.print(arr[i] + " ");}}public void swap(int one,int two){int temp = arr[one];arr[one] = arr[two];arr[two] = temp;}public void sort(){int in,out,temp;for(out=1;out<nElements;out++){temp = arr[out];in = out;while(in>0&&arr[in-1]>=temp){arr[in] = arr[in-1];//待插入的数据比其之前的数字大的右移,从小到大排序--in;//依次左移}arr[in] = temp;//直到遇到比temp小的,将temp插入}}public static void main(String[] args){InsertionSort arr = new InsertionSort(15);arr.insert(10);arr.insert(40);arr.insert(0);arr.insert(20);arr.insert(2);arr.insert(1);arr.insert(5);arr.insert(14);arr.insert(70);arr.insert(11);arr.display();System.out.println();arr.sort();arr.display();}
}