Java.util包中数组的排序算法 /** *将指定的字节子数组按升序排序。 */ 专用静态无效sort1(字节x[],整数关闭,整数长度){ //最小数组的插入排序 if(lenx[j];j--) 互换(x,j,j-1); 返回; }
来自Arrays.java第804-814行 如上所述,它声称使用插入排序。 然而,我把它当作泡泡排序?Java.util包中数组的排序算法 /** *将指定的字节子数组按升序排序。 */ 专用静态无效sort1(字节x[],整数关闭,整数长度){ //最小数组的插入排序 if(lenx[j];j--) 互换(x,j,j-1); 返回; },java,algorithm,Java,Algorithm,来自Arrays.java第804-814行 如上所述,它声称使用插入排序。 然而,我把它当作泡泡排序? 这整个排序算法是一个优化的快速排序算法,使用3个索引元素的中间值来获得枢轴元素,而您展示的代码是一个优化,当输入数组(或递归)很小时 尽管如此,引用的部分无疑是一种插入排序 但这是错误的,看看算法的这一部分,所以: 第573-577行对小型输入数组进行插入排序 第581-593行使用中位数3选择轴元素 第596-611行使用pivot元素进行排序 第614-616行将分区元素放回中间(快速
这整个排序算法是一个优化的快速排序算法,使用3个索引元素的中间值来获得枢轴元素,而您展示的代码是一个优化,当输入数组(或递归)很小时 尽管如此,引用的部分无疑是一种插入排序 但这是错误的,看看算法的这一部分,所以:
- 第573-577行对小型输入数组进行插入排序
- 第581-593行使用中位数3选择轴元素
- 第596-611行使用pivot元素进行排序
- 第614-616行将分区元素放回中间(快速排序)
- 第619-622行是输入数组两半的递归
有关快速排序的详细说明,请访问。对于已排序的数组,冒泡排序的外循环只运行一次,但插入的外循环运行n次(尽管每个外循环只有1次比较)
我认为很明显,这是插入排序。引用的代码是插入排序。冒泡排序重复通过整个数组,而插入排序排序第一个元素,然后是前两个元素,然后是前三个元素,等等。您可以分辨出来,因为代码有两个索引循环,而外部循环在冒泡排序只检查整个数组是否有序。冒泡排序只交换位于连续索引中的元素
更新:源代码中的注释可能错误:-)“我将其视为冒泡排序?”这是什么意思?它的意思是“对我来说,它看起来像冒泡排序”。(链接到Arrays.java:)对我来说,它看起来确实像冒泡排序。是的,这看起来像冒泡。但该方法没有结束。它只是长度<7的arry的一段代码。
/**
* Sorts the specified sub-array of bytes into ascending order.
*/
private static void sort1(byte x[], int off, int len) {
// Insertion sort on smallest arrays
if (len < 7) {
for (int i=off; i<len+off; i++)
for (int j=i; j>off && x[j-1]>x[j]; j--)
swap(x, j, j-1);
return;
}