目录
一.选择排序
选择排序的原理
首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。
选择排序原理动图
选择排序JAVA代码实现
public class Selection{
public static void sort(Comparable[] a){
//将a[]升序排列
int N = a.length;//数组长度
for(int i = 0;i < N;i++){
int min = i;//最小元素索引
for(int j = i+1;j < N;j++){
if(a[j] < a[min])
min = j;
}
//与最小元素交换
Comparable tmp = a[i];
a[i] = a[min];
a[min] = tmp;
}
}
}
选择排序复杂度
时间复杂度:O(n^2) 空间复杂度:O(1)
选择排序需要进行n-1趟选择,每一趟需要找出最小(大)的元素并交换位置,故时间复杂度为O(n^2)。选择排序的空间复杂度是O(1),因为只需要使用一个临时变量即可。
二.插入排序
插入排序的原理
通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到已经有序的牌中的适当位置。
在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。这种算法叫做插入排序。
插入排序的原理动图
插入排序JAVA代码实现
public class Insertion{
//将a[]按升序排序
int N = a.length;
for(int i = 1;i < N;i++){
//将a[]插入到a[i-1],a[i-2],a[i-3]...之中
for(int j = i;j > 0 && a[j] < a[j-1];j--){
Comparable tmp = a[j];
a[j] = a[j-1];
a[j-1] = a[j];
}
}
}
插入排序复杂度
时间复杂度为O(n^2) 空间复杂度为O(1)
从第二个值开始(第一个值已经排好序)每步将一个待排序的值按照其大小插入到前面已经排好序的合适位置(从后向前找合适位置,如果前面最后一个都不大于temp,那么位置不需要变化,继续下一个数的插入),直到全部插入排序为止
三.冒泡排序
冒泡排序的原理
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
冒泡排序的原理动图
冒泡排序JAVA代码实现
public class BubbleSort{
public static void sort(Comparable[] a){
for(int i = 0;i < a.length-1;i++){
boolean Flag = true;
for(int j = 0;j < a.length-1-i;j++){
if(a[j] > a[j+1]){
Comparable tmp = a[j+1];
a[j+1] = a[j];
a[j] = tmp;
Flag = false;
}
//如果上次没有进行交换,则说明已经排序完成,可提高效率
if(Flag)
break;
}
}
}
}
冒泡排序复杂度
时间复杂度为O(n^2) 空间复杂度为O(1)
从第一个数据开始,依次比较相邻元素的大小。如果前者大于后者,则进行交换操作,把大的元素往后交换。通过多轮迭代,直到没有交换操作为止。
插图来自网络