今日面试被问到排序问题,发现自己的不足,特来查漏补缺:
首先是各大排序算法的总结表
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |
冒泡排序 | Ο(n2) | Ο(n) | Ο(n2) | Ο(1) | 稳定 |
选择排序 | Ο(n2) | Ο(n2) | Ο(n2) | Ο(1) | 不稳定 |
插入排序 | Ο(n2) | Ο(n) | Ο(n2) | Ο(1) | 稳定 |
希尔排序 | Ο(nlogn) | Ο(nlog2n) | Ο(nlog2n) | Ο(1) | 不稳定 |
归并排序 | Ο(nlogn) | Ο(nlogn) | Ο(nlogn) | Ο(n) | 稳定 |
快速排序 | Ο(nlogn) | Ο(nlogn) | Ο(n2) | Ο(logn) | 不稳定 |
堆排序 | Ο(nlogn) | Ο(nlogn) | Ο(nlogn) | Ο(1) | 不稳定 |
计数排序 | Ο(n+k) | Ο(n+k) | Ο(n+k) | Ο(k) | 稳定 |
桶排序 | Ο(n+k) | Ο(n+k) | Ο(n2) | Ο(n+k) | 稳定 |
基数排序 | Ο(n*k) | Ο(n*k) | Ο(n*k) | Ο(n+k) | 稳定 |
今天回忆了冒泡排序与选择排序两种:
冒泡排序:比较两个相邻元素,将值大的元素交换至右端。
依次比较相邻的两个数,将小数放在左端,大数放在右端。第一趟结束后,最后一个数是最大的,第二趟比较时最后一个数不参加比较。
选择排序:每一趟在待排序的记录中找出最小元素,放在已经排好序的序列最后,直到所有记录排序完成。
第一趟排序,将arr[1]~arr[n]中最小的数与arr[1]交换;第2趟,将arr[2]~arr[n]间最小的数与arr[2]交换,依次类推。
二者区别:
1)冒泡排序是比较相邻两个位置的数,而选择排序是按照顺序比较,找到最大值或者最小值;
2)冒泡排序每一轮比较后,位置不对都需要换位置,而选择排序每一轮比较只换位一次;
3)冒泡排序是通过数去找位置,选择排序是通过位置来找数。
冒泡排序的优点比较简单、空间复杂度低,稳定;
缺点:时间复杂度较高,效率慢;
选择排序的优点:一轮比较只需要换一次位置
缺点:效率慢,不稳定,如5,3,5,2,9,第一次互换位置后,两个5的相对位置前后顺序就破坏了。
代码:待补充,已编辑进eclipse中。
首先用自己最近实战的java语言来进行一个排序问题编程:
问题:对输入的n个数排序并输出
输入:两行,第一行为n;第二行为需要进行排序的n个数
输出:一行,即排序后的数
1 import java.util.Scanner; 2 import java.util.Arrays; 3 public class Main{ 4 public static void main(String [] args){ 5 Scanner in = new Scanner(System.in); 6 while(in.hasNext()){ 7 int n = in.nextInt(); 8 int[] arr = new int[n]; 9 for(int i = 0;i<n;i++){ 10 arr[i] = in.nextInt(); 11 } 12 Arrays.sort(arr); 13 for(int i = 0;i<n;i++) 14 System.out.print(arr[i]+" "); 15 System.out.println(); 16 } 17 } 18 }