我从现场开始,对数组排序有疑问。 我找不到程序没有数组排序的原因 谢谢你的帮助。
代码
package sorting;
public class selectionSort
{
public static void main (String[]args)
{
int []a={2,5,3,1,7,10,12};
printArray(a);
insertSort(a);
printArray(a);
}
public static void insertSort(int[]array)
{
for(int i=0;i<array.length-1;i++)
{
int smallestIndex=i;
for(int j=i+1;j<array.length;j++)
{
if(array[smallestIndex]>array[j])
{
smallestIndex=j ;
}
if(smallestIndex!= i)
{
int temp=array[smallestIndex];
array[smallestIndex]=array[i];
array[i]=temp;
}
}
}
}//insertSORT
public static void printArray(int[] array)
{
for(int i=0 ;i<array.length;i++)
{
System.out.print(array[i]+" ");
}
System.out.println("");
}
}
答案 0 :(得分:2)
这种类型的逻辑应该是:
等等。
这里的问题是你需要找到阵列其余部分的 all 中哪个数字最小,并且只有在你完成最小的扫描之后,你应该用<我>我
元素。但是你的错误是你在扫描时交换了值。
所以,参加第一轮。
┌───┬───┬───┬───┬───┬────┬────┐ │ 2 │ 5 │ 3 │ 1 │ 7 │ 10 │ 12 │ └───┴───┴───┴───┴───┴────┴────┘ 0 1 2 3 4 5 6
你的我元素是2.你扫描并得到j = 3,1。你将smallestIndex
设置为3.然后你交换它们,现在你有了
┌───┬───┬───┬───┬───┬────┬────┐ │ 1 │ 5 │ 3 │ 2 │ 7 │ 10 │ 12 │ └───┴───┴───┴───┴───┴────┴────┘ 0 1 2 3 4 5 6
这恰好很好 - 但你还在扫描。您的j
现在转到4,指向7.第一个if
不正确。你不能改变smallestIndex
。但是,当您到达第二个3
时,其值仍为if
。所以你现在再次交换:
┌───┬───┬───┬───┬───┬────┬────┐ │ 2 │ 5 │ 3 │ 1 │ 7 │ 10 │ 12 │ └───┴───┴───┴───┴───┴────┴────┘ 0 1 2 3 4 5 6
然后再次为j = 5,然后当j = 6时再次返回。你最终在旧地方回来了。
解决方案是将交换移到外部j
循环 - 在确定哪个索引是最小索引之后,才交换它们。
public static void insertSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
int smallestIndex = i;
for (int j = i + 1; j < array.length; j++) {
if (array[smallestIndex] > array[j]) {
smallestIndex = j;
}
// Not here!
}
// Do the swap outside the j loop.
if (smallestIndex != i) {
int temp = array[smallestIndex];
array[smallestIndex] = array[i];
array[i] = temp;
}
}
}
答案 1 :(得分:0)
插入排序算法有两种方式,我的意思是你希望你的第一个for循环从左到右,第二个从右到左,从你到达的位置开始。 你检查第一个for循环中的下一个数字,如果小于你想要找到它所属位置的前一个数字,并将所有其他数字移到右边。
for(int i = 1; i < A.length; i++){
if(A[i]<A[i-1]){
for(int j = i; j > 0; j--){
do{
int x = A[j-1];
A[j-1] = A[j];
A[j] = x;
} while (A[j]<A[j-1]);
}
}
}
答案 2 :(得分:0)
首先, SELECTION 排序和 INSERTION 排序是两种不同的算法。您的方法名称具有误导性。
这里有关于其实施的信息: https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Selection_sort https://en.wikipedia.org/wiki/Selection_sort#Implementation https://en.wikipedia.org/wiki/Insertion_sort#Algorithm_for_insertion_sort