排序意味着将所有的元素按升序排列。 冲击我们头脑的问题是:第一,通过选择排序过程中涉及的程序是什么。 选择排序是指我们从数组的未排序子部分中反复寻找数组中最小的元素。
Java中的选择排序
java算法中的选择排序是通过反复从未排序的部分找到一个最小的项目(考虑到升序),并将其放在数组的开始位置来对数组进行排序。
选择排序在给定的数组中保持两个子数。
1)子数组,已经被排序了。
2)剩下的子数组是未排序的,即将被排序。
在选择排序的每一次迭代中,从未排序的子数中挑选出最小的项目(考虑升序)并移到已排序的子数中。
在选择排序中,我们必须保持两个子部分:左边和右边。
左边的部分是已排序的部分,右边的部分是未排序的部分。每一次,被排序的最小的元素都会从未排序的部分中分离出来,并包含在排序的部分列表中。
Java中选择排序的算法
请看下面的算法。
Selection(A,N)
Step1: Repeat step 2 and 3 for (k=0;k<N-1;k++)
Step2: Call MINIMUM(A,K,N,LOC)
Step3: Swap A[K] and A[LOC]
Step4: Exit
MINIMUM(A,K,N,LOC)
Step1: Set min=A[K] and LOC=K
Step2: Repeat step 3 and 4 for(i=k;i<N;i++)
Step3: if min>a[i]
Step4: set min=a[i] and LOC=i
Step5: Return LOC
让我们举一个例子。
假设我们有一个数组={11,4,13,8,10,7}。
步骤:1
选择给定数组中的最小元素。
这就是4,并与未排序部分的第一个元素11交换。
该数组将成为{4,11,13,8.10,7}。
在这个数组中,现在4是唯一存在于排序部分的元素,其余元素存在于未排序部分。
步骤:2
选择未排序部分的最小元素7,并将其与未排序部分的第一个元素11交换,数组将变成{4,7,13,8,10,11}。
现在在排序的列表中有一个增量,在数组的未排序列表中有一个减量。
步骤:3
然后,再次选择未排序部分的最小元素8,与未排序部分的第一个元素13交换,数组将变成{4, 7, 8, 13,10,11}。
现在,在数组的排序列表中有一个增量,在未排序列表中有一个减量。
步骤:4
同样的,选择未排序部分的最小元素10,并与未排序部分的第一个元素13互换,数组将变成{4, 7, 8, 10,13,11}。
现在,在数组的排序列表中有一个增量,在未排序列表中有一个减量。
步骤:5
然后,再次选择未排序部分的最小元素,即11,与未排序部分的第一个元素13互换,数组将变成{4, 7, 8, 10,11,13}。
整个数组变成了排序,而未排序的部分没有任何东西。
选择排序的时间复杂度
O(n2),因为有两个嵌套循环。
辅助空间
O(1).选择排序的好处是它永远不会进行超过O(n)次的交换,当内存写入是一个昂贵的操作时,它可以提供帮助。
选择排序的Java程序
请看下面的程序。
class Selection {
void sort(int ar[]) {
int n = ar.length;
for (int i = 0; i < n - 1; i++) {
int min = i;
for (int j = i + 1; j < n; j++) {
if (ar[j] < ar[min])
min = j;
}
int t = ar[min];
ar[min] = ar[i];
ar[i] = t;
}
}
public static void main(String args[]) {
Selection ss = new Selection();
int ar[] = { 11, 4, 13, 8, 10, 7 };
ss.sort(ar);
int n = ar.length;
System.out.println("Array after Selection Sort: ");
for (int i = 0; i < n; ++i)
System.out.print(ar[i] + " ");
System.out.println();
}
}
请看下面的输出。
本教程到此结束。