如何计算插入排序中的比较和交换? (JAVA)
How to count comparisons and swaps in insertion sort? (JAVA)
public class Sorting
{
public static int numOfComps = 0,
numOfSwaps = 0;
public static void insertionSort(int[] array)
{
int unsortedValue; // The first unsorted value
int scan; // Used to scan the array
// The outer loop steps the index variable through
// each subscript in the array, starting at 1. The portion of
// the array containing element 0 by itself is already sorted.
for (int index = 1; index < array.length; index++)
{
// The first element outside the sorted portion is
// array[index]. Store the value of this element
// in unsortedValue.
unsortedValue = array[index];
// Start scan at the subscript of the first element
// outside the sorted part.
scan = index;
// Move the first element in the still unsorted part
// into its proper position within the sorted part.
while (scan > 0 && array[scan-1] > unsortedValue)
{
array[scan] = array[scan - 1];
scan--;
// Counts the number of values swaps
numOfSwaps ++;
}
// Insert the unsorted value in its proper position
// within the sorted subset.
array[scan] = unsortedValue;
// Counts the number of values comparisons
numOfComps ++;
}
System.out.println("\n\nNumber of comps = " + numOfComps);
System.out.println("Number of swaps = " + numOfSwaps);
}
}
新手又来了。如何在 Java 中编写这个插入排序程序来计算比较次数和交换次数?我已经在程序中插入了比较和交换代码,但不确定它们是否在正确的位置。我已经发布了程序。谢谢你的帮助。
比较的次数就是array[scan-1] > unsortedValue
执行的次数。那不是你算的。
提示:
while (EXPRESSION) { STATEMENTS }
可以改写为while (true) { if (!(EXPRESSION)) { break; } STATEMENTS }
!(EXPRESSION1 && EXPRESSION2)
可以改写为!(EXPRESSION1) || !(EXPRESSION2)
.
if (EXPRESSION1 || EXPRESSION2) { break; }
可以改写为if (EXPRESSION1) { break; } if (EXPRESSION2) { break; }
.
该算法不会交换变量对的值。但是,存在一种多变量交换形式(A⇒B,B⇒C,C⇒D,D⇒A)。发生这种情况的次数是scan
与index
不同时执行array[scan] = unsortedValue
的次数。那不是你算的。
备注:
您的代码有错误。当你达到array[scan] = unsortedValue;
时,scan
可以是-1
。排序 2, 1
.
时会发生这种情况
请注意,这是一个糟糕的插入排序实现。应该使用二分搜索而不是线性搜索。这会将最大比较次数从 N * N 减少到 N * log N。
public class Sorting
{
public static int numOfComps = 0,
numOfSwaps = 0;
public static void insertionSort(int[] array)
{
int unsortedValue; // The first unsorted value
int scan; // Used to scan the array
// The outer loop steps the index variable through
// each subscript in the array, starting at 1. The portion of
// the array containing element 0 by itself is already sorted.
for (int index = 1; index < array.length; index++)
{
// The first element outside the sorted portion is
// array[index]. Store the value of this element
// in unsortedValue.
unsortedValue = array[index];
// Start scan at the subscript of the first element
// outside the sorted part.
scan = index;
// Move the first element in the still unsorted part
// into its proper position within the sorted part.
while (scan > 0 && array[scan-1] > unsortedValue)
{
array[scan] = array[scan - 1];
scan--;
// Counts the number of values swaps
numOfSwaps ++;
}
// Insert the unsorted value in its proper position
// within the sorted subset.
array[scan] = unsortedValue;
// Counts the number of values comparisons
numOfComps ++;
}
System.out.println("\n\nNumber of comps = " + numOfComps);
System.out.println("Number of swaps = " + numOfSwaps);
}
}
新手又来了。如何在 Java 中编写这个插入排序程序来计算比较次数和交换次数?我已经在程序中插入了比较和交换代码,但不确定它们是否在正确的位置。我已经发布了程序。谢谢你的帮助。
比较的次数就是array[scan-1] > unsortedValue
执行的次数。那不是你算的。
提示:
while (EXPRESSION) { STATEMENTS }
可以改写为while (true) { if (!(EXPRESSION)) { break; } STATEMENTS }
!(EXPRESSION1 && EXPRESSION2)
可以改写为!(EXPRESSION1) || !(EXPRESSION2)
.if (EXPRESSION1 || EXPRESSION2) { break; }
可以改写为if (EXPRESSION1) { break; } if (EXPRESSION2) { break; }
.
该算法不会交换变量对的值。但是,存在一种多变量交换形式(A⇒B,B⇒C,C⇒D,D⇒A)。发生这种情况的次数是scan
与index
不同时执行array[scan] = unsortedValue
的次数。那不是你算的。
备注:
您的代码有错误。当你达到
array[scan] = unsortedValue;
时,scan
可以是-1
。排序2, 1
. 时会发生这种情况
请注意,这是一个糟糕的插入排序实现。应该使用二分搜索而不是线性搜索。这会将最大比较次数从 N * N 减少到 N * log N。