一:经典的冒泡排序
相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。
//①.先声明一个数组长度为10
int[] arr = new int[10];
//②.数组元素进行赋值(随机对其进行赋值)0-100
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 100);
}
//遍历数组,用增强for循环
for (int tmp : arr) {
System.out.print(tmp + " ");
}
System.out.println();
//冒泡排序数组的下角标0-length-1进行对比(数组元素大小)arr[j]>arr[j+1]
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
//遍历数组
System.out.println();
for (int tmp : arr) {
System.out.print(tmp + " ");
}
运行结果如下
算法的时间效率:从冒泡排序的算法可以看出,若待排序的元素为正序,则只需进行一趟排序,比较次数为n-1次,移动元素次数为0;若待排序的元素为逆序,则需要进行n-1趟排序。
算法的空间效率:空间效率很高,只需要一个附加程序单元用于交换,其空间效率为O(1)
算法的稳定性:稳定
二:选择排序
将待排序的元素分为已排序(初始为空)和未排序两组,依次将未排序的元素中值最小的元素放入已排序的组中。直接选择排序简单直观,但性能略差;堆排序是一种较为高效的选择排序方法,但实现起来略微复杂
for (int i = 0; i <arr.length-1 ; i++) {
//声明一个变量保存最小值
int minindex=i;
for (int j = i+1; j <arr.length; j++) {
if(arr[j]<arr[minindex]){
arr[minindex]=arr[j];
}
}
if (minindex!=i){
int tmp1=arr[i];
arr[i]=arr[minindex];
arr[minindex]=tmp;
}
}
for (int i : arr) {
System.out.print(i+" ");
}
算法的时间效率:无论初始状态如何,在第i趟排序中选择最小关键码的元素,需做n-i次比较,因此总的比较次数为:
算法的空间效率:空间效率很高,只需要一个附加程序单元用于交换,其空间效率为O(1)
算法的稳定性:不稳定
三:使用ljava.util.Arrays类的sort()方法提供了数组元素排序功能
Arrays.sory(arr);
//遍历数组
for (int i : arr) {
System.out.print(i+" ");
}
排序算法分为内部排序和外部排序
内部排序:整个排序过程不需要借助外部储存器(如磁盘等),所有排序操作都在内存空间中完成。
外部排序:参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部储存(如磁盘),外部排序最常见的是多路归并排序,可以为外部排序是由多次内部排序完成
选择排序
直接选择排序、堆 排序
交换排序
冒泡排序、快速 排序
插入 排序
直接插入排序、 折半插入排序 、 Shell 排序
归并排序
桶式排序
基数排序
各种内部排序方法性能比较
1.从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。
2.从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法,都包含在上图的“简单排序”中。对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。
3.从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排序、快速排序、 Shell排序和堆排序是不稳定排序
4.从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。
排序方法的选择
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。