Java排序算法(二):直接选择排序 .
2014-09-28 12:29
246 查看
Java排序算法(二):直接选择排序
直接选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,它需要经过n-1趟比较。算法不稳定,O(1)的额外的空间,比较的时间复杂度为O(n^2),交换的时间复杂度为O(n),并不是自适应的。在大多数情况下都不推荐使用。只有在希望减少交换次数的情况下可以用。
基本思想
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
算法实现
[java]
view plaincopyprint?
public class SelectSortTest {
public static void main(String[] args) {
int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
print(data);
selectSort(data);
print(data);
}
public static void swap(int[] data, int i, int j) {
if (i == j) {
return;
}
data[i] = data[i] + data[j];
data[j] = data[i] - data[j];
data[i] = data[i] - data[j];
}
public static void selectSort(int[] data) {
for (int i = 0; i < data.length - 1; i++) {
int minIndex = i; // 记录最小值的索引
for (int j = i + 1; j < data.length; j++) {
if (data[j] < data[minIndex]) {
minIndex = j; // 若后面的元素值小于最小值,将j赋值给minIndex
}
}
if (minIndex != i) {
swap(data, i, minIndex);
print(data);
}
}
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}
运行结果:
[html]
view plaincopyprint?
5 3 6 2 1 9 4 8 7
1 3 6 2 5 9 4 8 7
1 2 6 3 5 9 4 8 7
1 2 3 6 5 9 4 8 7
1 2 3 4 5 9 6 8 7
1 2 3 4 5 6 9 8 7
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
参考:http://developer.51cto.com/art/201104/256371.htm
直接选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完,它需要经过n-1趟比较。算法不稳定,O(1)的额外的空间,比较的时间复杂度为O(n^2),交换的时间复杂度为O(n),并不是自适应的。在大多数情况下都不推荐使用。只有在希望减少交换次数的情况下可以用。
基本思想
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
算法实现
[java]
view plaincopyprint?
public class SelectSortTest {
public static void main(String[] args) {
int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };
print(data);
selectSort(data);
print(data);
}
public static void swap(int[] data, int i, int j) {
if (i == j) {
return;
}
data[i] = data[i] + data[j];
data[j] = data[i] - data[j];
data[i] = data[i] - data[j];
}
public static void selectSort(int[] data) {
for (int i = 0; i < data.length - 1; i++) {
int minIndex = i; // 记录最小值的索引
for (int j = i + 1; j < data.length; j++) {
if (data[j] < data[minIndex]) {
minIndex = j; // 若后面的元素值小于最小值,将j赋值给minIndex
}
}
if (minIndex != i) {
swap(data, i, minIndex);
print(data);
}
}
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + "\t");
}
System.out.println();
}
}
public class SelectSortTest { public static void main(String[] args) { int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data); selectSort(data); print(data); } public static void swap(int[] data, int i, int j) { if (i == j) { return; } data[i] = data[i] + data[j]; data[j] = data[i] - data[j]; data[i] = data[i] - data[j]; } public static void selectSort(int[] data) { for (int i = 0; i < data.length - 1; i++) { int minIndex = i; // 记录最小值的索引 for (int j = i + 1; j < data.length; j++) { if (data[j] < data[minIndex]) { minIndex = j; // 若后面的元素值小于最小值,将j赋值给minIndex } } if (minIndex != i) { swap(data, i, minIndex); print(data); } } } public static void print(int[] data) { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + "\t"); } System.out.println(); } }
运行结果:
[html]
view plaincopyprint?
5 3 6 2 1 9 4 8 7
1 3 6 2 5 9 4 8 7
1 2 6 3 5 9 4 8 7
1 2 3 6 5 9 4 8 7
1 2 3 4 5 9 6 8 7
1 2 3 4 5 6 9 8 7
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
5 3 6 2 1 9 4 8 7 1 3 6 2 5 9 4 8 7 1 2 6 3 5 9 4 8 7 1 2 3 6 5 9 4 8 7 1 2 3 4 5 9 6 8 7 1 2 3 4 5 6 9 8 7 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
参考:http://developer.51cto.com/art/201104/256371.htm
相关文章推荐
- java排序算法(二):直接选择排序
- Java排序算法(二):直接选择排序
- Java排序算法(二):直接选择排序
- Java排序算法-直接选择排序
- Java排序算法(二):直接选择排序
- Java排序算法(二):直接选择排序
- Java排序算法——直接选择排序
- Java排序算法(二):直接选择排序
- 经典算法学习——直接选择排序
- JAVA排序算法之 选择排序
- 排序算法(快速排序、直接插入排序、直接选择、冒泡排序)
- 直接选择排序及交换二个数据的正确实现
- 第十六周 -项目1 -(5)直接选择排序
- (5)直接选择排序
- 第16周项目选择排序之直接选择排序
- 第十六周项目1(5)验证算法——直接选择排序
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
- 第16周项目1-直接选择排序
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- 堆排序与直接选择排序的比较