排序算法
在我们的日常编码中,排序是非常常见的一种需求,比如:查询一些订单,将订单按照日期进行排序;再比如查询商品信息,将商品信息按照价格进行排序等等。而我们常见的排序算法按照各自的时间复杂度可分为简单排序算法和高级排序算法两大类,这两种分类下的排序算法分别有以下几种:
简单排序算法 | 高级排序算法 |
---|---|
冒泡排序、选择排序、插入排序 | 希尔排序、归并排序、选择排序 |
后面就一一对以上几种常见排序算法进行简单记录分析。
简单排序算法——冒泡排序
冒泡排序(Bubble Sort): 是计算机科学领域的一种较为简单的排序算法。
冒泡排序的排序原理是需要重复遍历所需要排序的数据元素,依次比较相邻元素大小,然后对数据元素进行位置交换,直到没有所需要交换的数据元素为止。
冒泡排序图解:
冒泡排序实现:
在进行编码之前,我们先对该排序算法的API进行设计
说明 | |
---|---|
类名 | BubbleSort |
构造方法 | BubbleSort() 创建BubbleSort对象 |
成员方法 | 1、public static void sort(Comparable[] obj) 对数组内元素进行排序 2、private static boolean bigger(Comparable c1, Comparable c2) 判断c1是否大于c2 3、private static void exchange(Comparable[] obj, int i, int j) 交换obj数组中索引i和索引j处元素位置 |
代码实现:
public class BubbleSort {
/**
* 排序方法
*/
public static void sort(Comparable[] arr){
for (int i=0; i<arr.length; i++){
for (int j=i; j<arr.length; j++){
if (bigger(arr[i],arr[j])){
exchange(arr, i, j);
}
}
}
System.out.println(Arrays.toString(arr));
}
/**
* 判断c1是否大于c2
*/
private static boolean bigger(Comparable c1, Comparable c2){
return c1.compareTo(c2) > 0;
}
/**
* 交换obj数组中 索引i 与 索引j 处的元素位置
*/
private static void exchange(Comparable[] arr, int i, int j){
Comparable tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
冒泡排序时间复杂度:
最坏情况下,也就是数组结构为 {9,8,7,6,5,4,3,2,1} ,此时元素的比较次数为:
(N-1)+(N-2)+(N-3)+……+2+1 = ((N-1)+1)*(N-1)/2 = N^2/2 - N/2;
元素交换次数为:
(N-1)+(N-2)+(N-3)+……+2+1 = ((N-1)+1)*(N-1)/2 = N^2/2 - N/2;
总执行次数为:
(N^2/2 - N/2) + (N^2/2 - N/2) = N^2 - N;
按照大O推导法则,保留函数中最高阶项可得到冒泡排序的时间复杂度为O(N^2)。
以上便是冒泡排序的简单总结及实现。
码字不易 莫要白嫖哟 转载还请注明出处