排序算法:插入排序

举报
谙忆 发表于 2021/05/27 17:46:37 2021/05/27
【摘要】 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法 将n个元素的数列分为已有序和无序两个部分,如 下所示: {{a1},{a2,a3,a4,…,an}} {{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}} … {{a1(n-1),a2(n-1) ,…},{an...

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法

将n个元素的数列分为已有序和无序两个部分,如
下所示:

{{a1},{a2,a3,a4,…,an}}

{{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}

{{a1(n-1),a2(n-1) ,…},{an(n-1)}}

每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。

算法步骤

⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;

⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;

⒊重复第二步,共进行n-i次插入处理,数列全部有序。

package cn.hncu;

public class insertSort { public static void main(String[] args) { int[] a = new int[1000]; for(int i=0;i<a.length;i++){ a[i] = (int)(Math.random()*a.length); } long startTime = System.currentTimeMillis();//返回以毫秒为单位的当前时间。 //1 插入排序 //insertSort(a); //1.1 结合二分法的插入排序 insertSort2(a); print(a); long endTime = System.currentTimeMillis();//返回以毫秒为单位的当前时间。 System.out.println("程序运行时间: "+(endTime-startTime)+"ms"); } private static void insertSort(int[] a) { for(int i=0;i<a.length-1;i++){ int temp=a[i+1]; int j=i; while(a[j]>temp){ a[j+1]=a[j]; j--; if(j<0){ break; } } a[j+1]=temp; } } private static void insertSort2(int[] a) { for(int i=0;i<a.length-1;i++){ int temp=a[i+1]; int low = 0; int high = i; int mid; //在low与high之间的区域进行二分查找: //找到新插入元素的位置 while(low<=high){ mid=(low+high)/2; if(a[mid]>temp){ high=mid-1; }else{ low=mid+1; } } //经过上面的二分查找,得到新元素的位置是:high+1 //把[high+1,i]区间内的所有元素往后移一个位置 for(int j=i;j>high;j--){ a[j+1]=a[j]; } a[high+1]=temp; } } private static void print(int[] a) { for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); }

}

  
 

文章来源: chenhx.blog.csdn.net,作者:谙忆,版权归原作者所有,如需转载,请联系作者。

原文链接:chenhx.blog.csdn.net/article/details/50816160

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。