Java数组与排序问题
2017-06-17 14:46
232 查看
数组
Java中包括基本类型和对象类型,其中数组属于对象类型。(虽然在C++中数组也是基本类型)int[] a; a=new int[100]; //int[] a=new int[100]
数组存储在其他的地址中,a中指保存内个地址。
数组一旦创建,大小不会改变。初始化为空null,当我们尝试访问含有null数组数据项时,会得到空指针报错。
数组可以按照无须数组和有序数组来进行分别学习。
算法 | 时间复杂度 |
---|---|
线性查找 | O(N)(还可以) |
二分查找 | O(logN)(良好) |
无序数组的插入 | O(1)(优秀) |
有序(无序)数组的删除 | O(N) |
有序数组的删除 | O(N) |
简单排序
冒泡排序public void bubleSort(){ int out,in; for(out=n-1;out>1;out--){ for(in=0;in<out;in++){ if(a[in]>a[in+1]) swap(in,in+1); } } }//end private void swap(int m,int n){ long temp=a[m]; a[m]=a ; a =temp; }
思路:数组由小到大进行排序,每次将两个相邻的数据进行比较,将大的那个放在右边,整一套下来,保证了最大的在最右边。也就是说内部的in的循环结束后,下标大于out的数据项已经排好。
时间复杂度:O(N^2),可以说是相当慢了
选择排序
public void selectionSort(){ int out,in,min; for(out=0;out<n-1;out++){ min=out; for(in=out+1;in<n;in++){ if(a[in]<a[min]) min=in; swap(out,min);//swap()函数同上,实际交换的是引用的位置 } } }//end
不同于冒泡排序中数组下标大于out的总是有序的,在选择排序中,数组下标小于in的总是有序的。
选择排序中,进行的比较次数和冒泡排序中的一样多,但是交换次数只有O(N),但是我们认为N值很大时,时间复杂度依然是O(N^2)。但是选择排序会比冒泡排序要快很多啦。
- 插入排序
public void insertionSort(){ int in,out; for(out=1;out<n;out++){ long temp=a[out]; in=out; while(in>0&&a[in-1]>temp){ a[in]=a[in-1]; --in; } a[in]=temp; } }
每一趟之后,比out下标小的总是有序的。out标记了未排序部分的最左端数据,in从out变量向左移动,直到temp值小于in所指的数组数据项。
适用于基本有序的数组。
tips:
复制是交换的三倍
在插入排序中,一个数据项被插入到局部有序的组合后,他将永远不会向左边移动。
稳定性是指在对州进行排序时,每个周的城市还要求按照人口递增排序。
相关文章推荐
- java数组、字符串比较插入及排序问题
- [JAVA]有关比较器(Comparator接口)的用法及对象数组排序问题
- java数组、排序问题1
- Java 对象数组多属性条件排序问题(详解)
- [Java]有关比较器(Comparator接口)的用法及对象数组排序问题
- JNI之c/c++返回中文给java 乱码问题以及java数组在c排序
- java数组排序问题:array.sort()是从小到大排序,那么如何从大到小排序?
- 黑马程序员:Java基础总结----数组排序问题
- java中数组常见的排序问题整理
- Java数组-选择排序-排序的性能问题
- 集合相等问题(java sort排序数组长度问题)
- 两个有序数组的合并排序,Java代码实现,并去重复,考虑空间利用率问题
- java学习之路 之 面向对象编程-main方法的语法、数组排序、操作数组的工具类、数组操作常见问题
- java中数组排序问题
- 2752:字符串数组排序问题(java语言)
- java数组排序问题
- 两个有序数组的合并排序,Java代码实现,并去重复,考虑空间利用率问题
- 小实例-实现对成绩总分由高到低的排序-Java中数组对象的排序
- Java对象数组初始化与NullPointerException问题
- 【转】Java数组排序总结(冒泡,选择,插入,希尔)