排序2——选择排序及优化

来源:互联网 发布:sql where and 编辑:程序博客网 时间:2024/06/05 20:57

二、选择排序

1、未经优化的选择排序

import java.util.Scanner;public class Test{//定义数组的最大长度static final int num=100;//选择排序public static void SelectSort(int[] arr,int length){int temp;  //临时变量for(int i=1;i<length;i++){for(int j=i+1;j<=length;j++){//在符合该条件的情况下,每次都要进行交换if(arr[i]>arr[j]){temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}}}public static void main(String[] args) {int[] arr=new int[num];Scanner in=new Scanner(System.in);System.out.println("请输入数组中的元素个数(<=100):");int length=in.nextInt();System.out.println("输入数组中的元素:");for(int i=1;i<=length;i++){arr[i]=in.nextInt();}//调用排序方法对数组进行排序SelectSort(arr, length);System.out.println("排序后的数组:");for(int i=1;i<=length;i++){System.out.print(arr[i]+" ");}}}

运行结果 :

请输入数组中的元素个数(<=100):
10
输入数组中的元素:
23 34 56 76 33 11 22 33 55 77
排序后的数组:
11 22 23 33 33 34 55 56 76 77 


这种方法的缺点是:在一轮比较的过程中,每次遇到if条件成立时都要进行交换。

解决方案:在一轮比较的过程中,只需记录下标即可,在一轮比较完成后再进行交换。


2、优化后

import java.util.Scanner;public class Test{//定义数组的最大长度static final int num=100;//选择排序public static void SelectSort(int[] arr,int length){for(int i=1;i<length;i++){int minIndex=i;for(int j=i+1;j<=length;j++){if(arr[j]<arr[minIndex]){//只需记录下标的变化minIndex=j;}}//在一轮比较完成后再进行交换if(minIndex!=i){int temp=arr[i];arr[i]=arr[minIndex];arr[minIndex]=temp;}}}public static void main(String[] args) {int[] arr=new int[num];Scanner in=new Scanner(System.in);System.out.println("请输入数组中的元素个数(<=100):");int length=in.nextInt();System.out.println("输入数组中的元素:");for(int i=1;i<=length;i++){arr[i]=in.nextInt();}//调用排序方法对数组进行排序SelectSort(arr, length);System.out.println("排序后的数组:");for(int i=1;i<=length;i++){System.out.print(arr[i]+" ");}}}


时间复杂度:O(n^2)

稳定性:不稳定