JAVA插入排序分析

其实我基础很差,最近无聊同时发现教别人的时候自己才会懂很多东西,给大家分析下面试经常遇到的插入排序。别只会用,要理解才行,随便写的,看不明白的联系我。老鸟飘过(JAVA代码,直接复制可用)

package com.chris;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 插入排序
* @author chris
*
*/
public class InsertSort {
List<Integer> al;
/**
* 构造方法,生成随机数组
* 
* @param num
* @param mod
*/
public InsertSort(int num, int mod) {
al = new ArrayList<Integer>(num);
Random rand = new Random();
System.out.println("排序前的数据:");
for (int i = 0; i < num; i++) {
al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
System.out.println("al[" + i + "]=" + al.get(i));
}
}
/**
* 进行排序(由小到大)
*/
public void SortIt() {
int tempInt;
int MaxSize = 1;//待比较数据的索引,从第一个开始
System.out.println("\n\n【观察以下部分每行数据与排序前每个数据的位置】");
for (int i = 1; i < al.size(); i++) {
tempInt = (int) al.remove(i);//移除当前位置的数据,并将这个数据存放到tempInt中
if (tempInt >= ((int) al.get(MaxSize - 1))) {
al.add(MaxSize, tempInt);//如果移除的这个数据比前一个大,就把这个数据放回原位,不做处理
MaxSize++;//索引+1
System.out.println("当前list中的数据:" + al.toString());
//2,7,5
} else {
/**
* 下面的操作就是把这个数据插入当前索引之前第一个比它大的数据的索引的位置<br />
* 如果看不懂,就运行看效果就明白了br/>
* 
*/

for (int j = 0; j < MaxSize; j++) {
if ((int) al.get(j) >= tempInt) {
al.add(j, tempInt);
MaxSize++;//索引+1
System.out.println("当前list中的数据:" + al.toString());
break;
}
}
}
}
System.out.println("【观察以上部分每行数据与排序前每个数据的位置】\n\n");
System.out.println("排序后的数据:");
for (int i = 0; i < al.size(); i++) {
System.out.println("al[" + i + "]=" + al.get(i));
}
}
public static void main(String[] args) {
InsertSort is = new InsertSort(10, 100);
is.SortIt();
}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
插入排序是一种简单直观的排序算法,它的基本思想是将一个新元素插入到已排序好的数组中,使插入后的数组仍然有序。 下面是插入排序Java代码实现: ```java public static void insertionSort(int[] arr) { int len = arr.length; for (int i = 1; i < len; i++) { int temp = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > temp) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = temp; } } ``` 我们可以通过比较不同数据规模下插入排序的运行时间来分析其效率。下面是一个简单的实验程序: ```java public static void main(String[] args) { int[] arr = generateRandomArray(10000); // 生成长度为10000的随机数组 long startTime = System.currentTimeMillis(); // 记录排序开始时间 insertionSort(arr); long endTime = System.currentTimeMillis(); // 记录排序结束时间 System.out.println("插入排序耗时:" + (endTime - startTime) + "毫秒"); } ``` 我们可以将数据规模逐步增大,比较不同数据规模下的排序时间。例如,对于长度为10000、20000、30000、40000、50000的随机数组,我们可以得到如下结果: | 数据规模 | 排序耗时(毫秒) | | -------- | ---------------- | | 10000 | 19 | | 20000 | 72 | | 30000 | 162 | | 40000 | 303 | | 50000 | 481 | 从上表中可以看出,随着数据规模的增大,插入排序的耗时也呈现出线性增长的趋势。与选择排序相比,插入排序的效率要略好一些,但仍然不如其他高级排序算法(如快速排序、归并排序等)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值