1. 冒泡排序
冒泡排序可以算是最经典的排序算法了,因为实现方法最简单,两层 for 循环, 里层循环中判断相邻两个元素是否逆序,是的话将两个元素交换,外层循环一次,就能将数组中剩下的元素中最小的元素“浮”到最前面,所以称之为冒泡排序。
照例举个简单的实例吧:
初始状态: [24, 19, 26, 39, 36, 7, 31, 29, 38, 23]
内层第一趟: [24, 19, 26, 39, 36, 7, 31, 29, 23 , 38 ] ( 9th
[23]8th [38 )
内层第二趟: [24, 19, 26, 39, 36, 7, 31, 23 , 29 , 38] ( 8th
[23]7th [29] )
内层第三趟: [24, 19, 26, 39, 36, 7, 23 , 31 , 29, 38] ( 7th
[23]6th [31] )
内层第四趟: [24, 19, 26, 39, 36, 7, 23, 31, 29, 38] ( 7 、 23 都位于正确的顺序,无需交换)
内层第五趟: [24, 19, 26, 39, 7 , 36 , 23, 31, 29, 38] ( 5th [7]4th
[36] )
内层第六趟: [24, 19, 26, 7 , 39 , 36, 23, 31, 29, 38] ( 4th [7]3rd
[39] )
内层第七趟: [24, 19, 7 , 26 , 39, 36, 23, 31, 29, 38] ( 3rd [7]2nd
[26] )
内层第八趟: [24, 7 , 19 , 26, 39, 36, 23, 31, 29, 38] ( 2nd [7]1st
[19] )
内层第九趟: [7 , 24 , 19, 26, 39, 36, 23, 31, 29, 38] ( 1st [7]0th
[24] )
…...
其实冒泡排序跟选择排序比较相像,比较次数一样,都为 n * (n + 1) / 2 , 但是冒泡排序在挑选最小值的过程中会进行额外的交换(冒泡排序在排序中只要发现相邻元素的顺序不对就会进行交换,
与之对应的是选择排序,只会在内层循环比较结束之后根据情况决定是否进行交换),所以在我看来,选择排序属于冒泡排序的改进版。
鉴于大家的评分给的比较低,下面给出算法实现
public >void sort(T[] array, boolean ascend) {
int length = array.length ;
int lastExchangedIdx = 0;
for (int i = 0; i
// mark the flag to identity whether exchange happened to false boolean isExchanged = false ;
// last compare and exchange happened before reaching index i int currOrderedIdx = lastExchangedIdx> i ? lastExchangedIdx : i;
for (int j = length - 1; j >currOrderedIdx; j--) {
int compare = array[j - 1].compareTo(array[j]); if (compare != 0 && compare > 0 == ascend) {
exchange (array, j - 1, j);
isExchanged = true ;
lastExchangedIdx = j;
}
}
// if no exchange happen means array is already in order if (isExchanged == false ) {
break ;
}
}
}
2、选择排序实现
改进版的选择排序实现如下:
public >void sort(T[] array, boolean ascend) {
int len = array.length ;
for (int i = 0; i
int selected = i;
for (int j = i + 1; j
int compare = array[j].compareTo(array[selected]); if (compare != 0 && compare
}
}
exchange (array, i, selected);
}
}
1. 冒泡排序
冒泡排序可以算是最经典的排序算法了,因为实现方法最简单,两层 for 循环, 里层循环中判断相邻两个元素是否逆序,是的话将两个元素交换,外层循环一次,就能将数组中剩下的元素中最小的元素“浮”到最前面,所以称之为冒泡排序。
照例举个简单的实例吧:
初始状态: [24, 19, 26, 39, 36, 7, 31, 29, 38, 23]
内层第一趟: [24, 19, 26, 39, 36, 7, 31, 29, 23 , 38 ] ( 9th
[23]8th [38 )
内层第二趟: [24, 19, 26, 39, 36, 7, 31, 23 , 29 , 38] ( 8th
[23]7th [29] )
内层第三趟: [24, 19, 26, 39, 36, 7, 23 , 31 , 29, 38] ( 7th
[23]6th [31] )
内层第四趟: [24, 19, 26, 39, 36, 7, 23, 31, 29, 38] ( 7 、 23 都位于正确的顺序,无需交换)
内层第五趟: [24, 19, 26, 39, 7 , 36 , 23, 31, 29, 38] ( 5th [7]4th
[36] )
内层第六趟: [24, 19, 26, 7 , 39 , 36, 23, 31, 29, 38] ( 4th [7]3rd
[39] )
内层第七趟: [24, 19, 7 , 26 , 39, 36, 23, 31, 29, 38] ( 3rd [7]2nd
[26] )
内层第八趟: [24, 7 , 19 , 26, 39, 36, 23, 31, 29, 38] ( 2nd [7]1st
[19] )
内层第九趟: [7 , 24 , 19, 26, 39, 36, 23, 31, 29, 38] ( 1st [7]0th
[24] )
…...
其实冒泡排序跟选择排序比较相像,比较次数一样,都为 n * (n + 1) / 2 , 但是冒泡排序在挑选最小值的过程中会进行额外的交换(冒泡排序在排序中只要发现相邻元素的顺序不对就会进行交换,
与之对应的是选择排序,只会在内层循环比较结束之后根据情况决定是否进行交换),所以在我看来,选择排序属于冒泡排序的改进版。
鉴于大家的评分给的比较低,下面给出算法实现
public >void sort(T[] array, boolean ascend) {
int length = array.length ;
int lastExchangedIdx = 0;
for (int i = 0; i
// mark the flag to identity whether exchange happened to false boolean isExchanged = false ;
// last compare and exchange happened before reaching index i int currOrderedIdx = lastExchangedIdx> i ? lastExchangedIdx : i;
for (int j = length - 1; j >currOrderedIdx; j--) {
int compare = array[j - 1].compareTo(array[j]); if (compare != 0 && compare > 0 == ascend) {
exchange (array, j - 1, j);
isExchanged = true ;
lastExchangedIdx = j;
}
}
// if no exchange happen means array is already in order if (isExchanged == false ) {
break ;
}
}
}
2、选择排序实现
改进版的选择排序实现如下:
public >void sort(T[] array, boolean ascend) {
int len = array.length ;
for (int i = 0; i
int selected = i;
for (int j = i + 1; j
int compare = array[j].compareTo(array[selected]); if (compare != 0 && compare
}
}
exchange (array, i, selected);
}
}