一、排序算法的实现
举个栗子,对一组数据进行排序。方法如下:
首先对于数据可以先初始化或者选择从键盘上输入,初始化过程如下:
public class Sort {
public static void main(String args[]){
int[] Array = new int[]{45,32,67,54,31,41};
接下来就是进行排序方法的实现:
1.调用方法排序
Arrays.sort(数组名);
Arrays.sort(Array);
2.冒泡排序(比较容易上手)
很简单,用到的很少,据了解,面试的时候问的比较多!
其基本思想为(如升序排列,就是想从小到大的排序):从第一个元素开始,对数组中两两两相邻的元素比较,将数值较小的元素进行交换后放在前面,数值较大的元素进行交换后放在后面 ,一轮比较完成后(也就是完成一次内循环后),数组中最大的数已经放在数组中最后一位,一些较小的数如同气泡一样上浮一个位置。n个数,进行n-1轮比较后完成排序。(如果对于嵌套循环有什么疑惑之处,请找度娘!)
代码如下:
//冒泡排序
for(int i=0;i<Array.length;i++){
for(int j=i+1;j<Array.length;j++){
if(Array[i]>Array[j]){
int temp = Array[j];
Array[j] = Array[i];
Array[i] = temp;
}
}
}
3.选择排序
其基本思想: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
代码实现:
for(int i=0;i<Array.length;i++){
int tem=i;
for(int j=i+1;j<Array.length;j++){
if(Array[j]<Array[tem]){
tem = j;
}
}
int temp = Array[i];
Array[i] = Array[tem];
Array[tem] = temp;
}
补充1:选择排序的时间复杂度为O(n^2),由于每次选择仅考虑某一位置上的数据情况,可能会破坏之前数据的相对位置,因此它是一种不稳定的排序方法。
当然还有其它一些排序算法,有兴趣的可以去平台找找答案。
二、总结(算法的特点)
1.算法的稳定性:
其概念:算法稳定性指的是在一组待排序记录中,如果存在任意两个相等的记录R和S,且在待排序记录中R在S前,如果在排序后R依然在S前,即它们的前后位置在排序前后不发生改变,则称为排序算法为稳定的。
稳定:冒泡排序、插入排序、归并排序和基数排序
不稳定:选择排序、快速排序、希尔排序、堆排序
2.平均时间复杂度
O(n^2):直接插入排序,简单选择排序,冒泡排序。
在数据规模较小时,直接插入排序,简单选择排序差不多。
当数据较大时,冒泡排序算法的时间代价最高。性能为O(n^2)的算法基
本上是相邻元素进行比较,基本上都是稳定的。
O(nlogn):快速排序,归并排序,希尔排序,堆排序。
其中,快排是最好的, 其次是归并和希尔,堆排序在数据量很大时
效果明显。
三、算法的选择
1.数据规模较小
(1)待排序列基本序的情况下,可以选择直接插入排序;
(2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入
或冒泡。
2.数据规模不是很大
(1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,
此时要付出log(N)的额外空间。
(2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序。
3.数据规模很大
(1)对稳定性有求,则可考虑归并排序。
(2)对稳定性没要求,宜用堆排序。
4.序列初始基本有序(正序),宜用直接插入,冒泡。
补充2:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。
借鉴一张图片如下、