ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java十大经典算法

2022-07-07 16:02:31  阅读:140  来源: 互联网

标签:arr java int 插入排序 元素 算法 经典 array 排序


1.希尔排序

希尔排序是插入排序的改进,不必再像插入排序一样一个一个比较再交换,它的精髓在于增量交换,因此又叫做缩小增量排序。常用初始增量为len/2,这样就把所有元素分为了若干组,每次通过比较、交换相差增量的元素,然后缩小增量,重复这个过程直至增量变为1,这样每一个元素都排好了位置。

希尔排序的时间复杂度为O(nlogn),是首个时间复杂度冲破O(n^2)的算法。

下面是它的java代码实现

 

@Test
public void sort(){
int []array = new int[100000];
Random random = new Random();
for (int i =0;i < 100000;i++){
array[i]= random.nextInt(9000000);
}
//实现
for (int d = array.length/2 ; d > 0 ; d/=2) {//初始增量d为len/2,每次缩小一半直至最后为1
for (int i = d ;i<array.length;i++){//循环每一个分组
for (int j = i-d;j>=0 && array[j+d]<array[j];j-=d){//同一组且相邻增量的元素比较大小并交换,此循环结束代表该组的大小排序完成
swap(array,j,j+d);
}
}
}
log.info(Arrays.toString(array));
}


//交换元素
void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

经过测试,10w个元素的数组使用希尔排序耗时436ms

 


 

 
2.插入排序
看不懂希尔排序的话,不如先看看插入排序,插入排序顾名思义,把最小或最大的元素插入到合适的位置直至遍历所有元素即可。
也就是说插入排序要把第一个元素看作是有序的,从第二个元素开始和前一个元素比较大小,若符合条件则交换他们,重复这个过程直到不符合条件为止,
这样一来这个元素之前的都是有序的,之后的都是无序的。重复这个过程直到最后一个元素比较完,排序就结束了。
插入排序时间复杂度为O(n^2)
下面是代码实现
@Test
public void sort(){
int []array = new int[100000];
Random random = new Random();
for (int i =0;i < 100000;i++){
array[i]= random.nextInt(9000000);
}
//实现
for (int i = 1;i<array.length;i++){
for (int j = i-1;j>=0;j--){
if (array[j+1]<array[j]){
swap(array,j,j+1);
}
}
}
log.info(Arrays.toString(array));
}

经过测试,10w个元素的数组使用插入排序耗时10s175ms

 


 

是不是相差挺大的,当数据量小的时候两个算法差异还差不多,数据量大起来,耗费的时间只会越拉越大。

 


 

标签:arr,java,int,插入排序,元素,算法,经典,array,排序
来源: https://www.cnblogs.com/wzkris/p/16454976.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有