排序3——插入排序及优化

来源:互联网 发布:java解析log日志文件 编辑:程序博客网 时间:2024/05/17 06:11

三、选择排序

1、未经优化的选择排序:

import java.util.Scanner;public class Test{//定义数组的最大长度static final int num=100;//插入排序(升序)public static void InsertSort(int[] arr,int length){for(int i=2;i<=length;i++){//监视哨备份待查记录arr[0]=arr[i];int j;for(j=i-1;arr[0]<arr[j];j--){//记录后移arr[j+1]=arr[j];}//将哨兵插入到正确的位置arr[j+1]=arr[0];}}public static void main(String[] args) {int[] arr=new int[num];Scanner in=new Scanner(System.in);System.out.println("请输入数组中的元素个数(<=100):");int length=in.nextInt();System.out.println("输入数组中的元素:");for(int i=1;i<=length;i++){arr[i]=in.nextInt();}//调用排序方法对数组进行排序InsertSort(arr, length);System.out.println("排序后的数组:");for(int i=1;i<=length;i++){System.out.print(arr[i]+" ");}}}


运行结果:

请输入数组中的元素个数(<=100):
10
输入数组中的元素:
23 34 56 76 33 11 22 33 55 77
排序后的数组:
11 22 23 33 33 34 55 56 76 77 


分析此段算法可以发现,在最后一趟过程中,77已经是当前最大的记录关键字,不需要进行该趟排序。

下面改进上面的算法。


2、优化后的插入排序:

import java.util.Scanner;public class Test{//定义数组的最大长度static final int num=100;//插入排序(升序)public static void InsertSort(int[] arr,int length){for(int i=2;i<=length;i++){//在该位置进行判断,看是否需要进行比较if(arr[i]<arr[i-1]){//监视哨备份待查记录arr[0]=arr[i];int j;for(j=i-1;arr[0]<arr[j];j--){//记录后移arr[j+1]=arr[j];}//将哨兵插入到正确的位置arr[j+1]=arr[0];}}}public static void main(String[] args) {int[] arr=new int[num];Scanner in=new Scanner(System.in);System.out.println("请输入数组中的元素个数(<=100):");int length=in.nextInt();System.out.println("输入数组中的元素:");for(int i=1;i<=length;i++){arr[i]=in.nextInt();}//调用排序方法对数组进行排序InsertSort(arr, length);System.out.println("排序后的数组:");for(int i=1;i<=length;i++){System.out.print(arr[i]+" ");}}}

时间复杂度:O(n^2)

稳定性:稳定

原创粉丝点击