简单选择排序算法:
基本思想:
在待排序数据中,选出最小的一个数与第一个位置的数交换;然后在剩下的数中选出最小的数与第二个数交换;依次类推,直至循环到只剩下两个数进行比较为止。
实例:
0.初始状态 3,1,5,7,2,4,9,6(共8个数)
1.n=8 个数中,最小数值为1,与第一个数交换:1,3,5,7,2,4,9,6
2.剩下 n-1=7 个数中,最小数值为2,与第二个数交换:1,2,5,7,3,4,9,6
3.剩下 n-2=6 个数中,最小数值为3,与第三个数交换:1,2,3,7,5,4,9,6
4.剩下 n-3=5 个数中,最小数值为4,与第四个数交换:1,2,3,4,5,7,9,6
5.剩下 n-4=4 个数中,最小数值为5,与第五个数交换:1,2,3,4,5,7,9,6
6.剩下 n-5=3 个数中,最小数值为6,与第五个数交换:1,2,3,4,5,6,9,7
7.剩下 n-6=2 个数中,最小数值为7,与第五个数交换:1,2,3,4,5,6,7,9
简单选择排序算法的改进:
基本思想:
简单选择排序算法,每次只选择一个数据放在正确的位置,为提高效率,可每次选择两个数据,放在正确的位置,及每次选择最大值和最小值。
实例:
0.初始状态 3,1,5,7,2,4,9,6(共8个数)
1.n=8 个数中,最小数值为1,与第一个数交换;最大数值为9,与最后一个数交换:1,3,5,7,2,4,6,9
2.剩下n-2=6个数中,最小数值为2,与第二个数交换;最大数值为7,与倒数第二个数交换:1,2,5,6,3,4,7,9
3.剩下n-4=4个数中,最小数值为3,与第三个数交换;最大数值为6,与倒数第三个数交换:1,2,3,4,5,6,7,9
4.剩下n-6=2个数中,最小数值为4,与第四个数交换;最大数值为5,与倒数第四个数交换:1,2,3,4,5,6,7,9
Java实现:
/** * 选择排序 及其 改进算法 的实现 * 不稳定算法 * @author 那一季的银杏叶 * */ public class SelectSort { public static void main(String[] args) { // TODO Auto-generated method stub new SelectSort().run(); } public void run(){ int a[] = {3,1,5,7,2,4,9,6}; /** * 选择排序 */ selectSort(a); /** * 选择排序的改进--二元选择排序 */ selectTwoSort(a); } /** * 选择排序 每次选出最小的元素 * @param a */ private void selectSort(int[] a) { // TODO Auto-generated method stub System.out.println("———————————————————选择排序算法———————————————————"); int n=a.length; for(int i=0;i<n;i++){ int k=i; for(int j=i;j<n;j++){ if(a[j] < a[k]){ k=j; } } if(k != i){ int temp = a[i]; a[i]=a[k]; a[k] = temp; } print(a,n,i); } printResult(a,n); } /** * 选择排序的 改进算法 * 每次选出最大的数和最小的数 * @param a */ private void selectTwoSort(int[] a){ System.out.println("———————————————选择排序算法——的改进—————————————————"); int n=a.length; int i,j,max,min,temp; for(i=0;i<n/2;i++){ max=i; min=i; for(j = i+1;j<n-i;j++){ if(a[j]<a[min]){ min=j; } if(a[j]>a[max]){ max=j; } } temp = a[i]; a[i] = a[min]; a[min] = temp; temp = a[n-i-1]; a[n-i-1] = a[max]; a[max] = temp; print(a,n,i); } printResult(a,n); } /** * 打印排序的最终结果 * @param a * @param n */ private void printResult(int[] a, int n){ System.out.print("最终排序结果:"); for(int j=0;j<n;j++){ System.out.print(" "+a[j]); } System.out.println(); } /** * 打印排序的每次循环的结果 * @param a * @param n * @param i */ private void print(int[] a, int n, int i) { // TODO Auto-generated method stub System.out.print("第"+i+"次:"); for(int j=0;j<n;j++){ System.out.print(" "+a[j]); } System.out.println(); } }
运行结果展示: