当前位置: 首页 > 知识库问答 >
问题:

Java选择排序

锺离慈
2023-03-14

我在让我的排序检查每个索引时遇到问题。它跳过了j的第三个索引,因为它去了i[0]j[2],到i[0]j[4]我不知道它为什么这样做?。此外,我的数字实际上被交换时遇到了问题。有人知道我的错误在哪里吗?

static void selectionSort(int[] arr) {
    final long startTime = System.nanoTime(); // starts timer
    System.out.println("Selection Sort");
    //************** Code For Sorting *****************//
    //*************************************************//
    int counter = 0;
    int first = 0;
    int second = 0;
    
    // Copies unsorted array to new array
    //int[] sorted = Arrays.copyOf(arr, arr.length);
    
    // sorts unsorted array for comparison later on
    //Arrays.sort(sorted);
    
    // comparing the first index value to
    // the rest of the values in the array
    for (int i = 0; i < arr.length - 1; i++) {
        int minIndex = i;

        // representing the next index value 
        // to the original and comparing it
        for (int j = 1; j < arr.length - 1; j++) {
            int nextIndex = j;

            if (arr[minIndex] < arr[nextIndex]) {
                System.out.println("i: " + i);
                System.out.println("j: " + j);
                System.out.println("Checking next index");
            }
            if (arr[minIndex] > arr[nextIndex]) {
                System.out.println("i: " + i);
                System.out.println("j: " + j);
                //counter = j; // getting array index
                first = arr[minIndex];
                second = arr[nextIndex];
                minIndex = second;
                arr[minIndex] = second;
                System.out.println("first:" + first);
                System.out.println("second:" + second);
                System.out.println("minIndex:" + minIndex);
                System.out.println("arr[minIndex]:" + arr[minIndex]);
                System.out.println("Possible lowest unsorted value");
            }
            //Swap here
            if (arr[arr.length - 1] == arr[j]) {
                arr[0] = second;
                arr[counter] = first;
                counter = 0;
                //minIndex= i+1;
            }
        }
        for (int k = 0; k < arr.length; k++) {
            System.out.print(arr[k] + ", ");
        }
        System.out.println();
    }
}

共有2个答案

赵元白
2023-03-14

选择排序的算法如下所示:

public static void selectionSort(int[] arr) {
    // iterate over all subsets of the array
    // (0-last, 1-last, 2-last, 3-last, ...)
    for (int i = 0; i < arr.length; i++) {
        // assume the min is
        // the first element
        int min = arr[i];
        // index of the
        // min element
        int min_i = i;
        // check the elements
        // after i to find
        // the smallest
        for (int j = i + 1; j < arr.length; j++) {
            // if this element
            // is less, then it
            // is the new min
            if (arr[j] < min) {
                min = arr[j];
                min_i = j;
            }
        }
        // if min element is not
        // equal to the current
        // one, then swap them
        if (i != min_i) {
            int temp = arr[i];
            arr[i] = arr[min_i];
            arr[min_i] = temp;
        }
    }
}
public static void main(String[] args) {
    int[] arr = {5, 34, 1, 15, 3, 8, 9, 2, 7, 6, 43, 4};
    selectionSort(arr);
    System.out.println(Arrays.toString(arr));
    // [1, 2, 3, 4, 5, 6, 7, 8, 9, 15, 34, 43]
}
冯流觞
2023-03-14

您犯的第一个错误是在嵌套的for循环中。内部循环的起始索引(j)应始终从i 1开始(索引器i之前的一个位置),对于外部循环的每次迭代,而不是像您所做的那样,j=1。

其次,通过条件j

更改此:

for(int j = 1; j < arr.length-1; j++)

对此:

for(int j = i + 1; j < arr.length; j++)

接下来,您的算法似乎存在一些问题,包括您的交换功能,因此,让我们重新开始。

选择排序是一种基于就地比较的算法,其中数组分为两部分,左端排序部分和右端未排序部分。最初,排序部分为空,未排序部分为整个数组。

从未排序的数组中选择最小的元素并与最左侧的元素交换,该元素将成为已排序数组的一部分。此过程将继续将未排序的数组边界向右移动一个元素。

考虑到这一点,现在我们可以开始算法了。

public static void selectionSort(int[] arr){
    for(int i = 0; i < arr.length-1; i++){
        int minIndex = i;  // smallest element index
        for(int j = i + 1; j < arr.length; j++){
            if(arr[j] < arr[i]){  // find smallest element
                if(arr[j] < arr[minIndex])
                minIndex = j; // update smallest element index
            }
        }

        if(i != minIndex){  // swap
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }
    // print the result
    Arrays.stream(arr).forEach(System.out::println); 
}

作为旁注,选择排序复杂性为ο(N2),其中N是数组内的元素数。

 类似资料:
  • 预期:[硬币[价值=1.0,名称=美元],硬币[价值=0.25,名称=四分之一],硬币[价值=0.1,名称=一角硬币],硬币[价值=0.05,名称=镍],硬币[价值=0.01,名称=便士]]

  • 假设当前存在一个 int 类型的数组 number,该数组中的元素依次是 13、15、 24、99、4 和 1。如果使用冒泡排序进行两两相邻比较,第一趟排序后的结果如下: 第二趟排序后的结果如下: 第三趟排序后的结果如下: 第四趟排序后的结果如下: 第五趟排序后的结果如下: 使用选择排序法也可以对上述数组中的元素进行排序,但是它与冒泡排序不同。 选择排序是指每一趟从待排序的数据元素中选出最大(或最

  • 我一直在寻找一个递归选择排序,只使用2个参数: 必须排序的数组 一个值k,它指示要对哪个元素进行排序。 示例:a为{6,3,5,7,2}且k为2的SelectionSort(array[]a,int k)将对前3个元素进行排序,并保持最后的元素不变。 我想从一个if语句开始,k为0,如果是这样的话,它就会按原样返回数组,因为您不能对大小为1的数组进行排序。类似于: 我不知道如何做'else'部分,

  • 本文向大家介绍选择排序,包括了选择排序的使用技巧和注意事项,需要的朋友参考一下 在选择排序技术中,列表分为两部分。一部分将所有元素排序,而另一部分将未排序项目。首先,我们从数组中获取最大或最小数据。获得数据(例如最小值)后,我们将列表中的第一位数据替换为最小数据,从而将其放置在列表的开头。执行后,数组变得越来越小。这样就完成了这种分类技术。 选择排序技术的复杂性 时间复杂度:O(n ^ 2) 空间

  • 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。 1. 算法步骤 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。 2. 动图演示 3. JavaScript 代

  • 1. 前言 本节内容是排序算法系列之一:选择排序,主要讲解了选择排序的主体思路,选取了一个待排序的数字列表对选择排序算法进行了演示,给出了选择排序算法的 Java 代码实现,帮助大家可以更好的理解选择排序算法。 2. 什么是选择排序? 选择排序(Select Sort),是计算机科学与技术领域中较为简单的一种排序算法。 假设我们按照从小到大的顺序进行排序。选择排序会首先从待排序序列中选择一个最小的