Java——排序
关于排序我想大家都不陌生,所谓排序就是将输入的数字按照从小到大的顺序进行排列。当然排序也是多种多样的,接下来我们来一次看看各种排序:
插入排序(挖坑)
堆排序(挖坑)
归并排序(挖坑)
============================================================================
冒泡排序
首先我们从冒泡排序开始说吧(取自于算法动画图解)
先以这9个数为基础,从序列右边开始比较相邻两个数字的大小,这里就是比较7和6的大小,因为7>6,所以他们交换位置。结果如下图:
之后,天平向前移动,开始比较4和6,因为4<6,所以位置不变;天平在往前移,开始比较4和8,因为8>4,所以交换位置...........以此类推直到第一轮循环结束;
通过第一轮循环,把最小值排到了第一位,之后第二轮循环开始,天平重新从序列右边开始;
重复上述的过程......
不难看出第一轮需要比较n-1次,第二轮需要比较n-2次.........第n-1轮需要比较1次。因此,比较次数为(n-1)+(n-2)+......+1约为n^2/2。
时间复杂度为n^2;
代码实现如下:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] intarray; System.out.println("请输入数组的大小"); int n = scanner.nextInt(); intarray = new int [n]; System.out.println("请输入"+intarray.length+"个数字"); for(int i=0;i<intarray.length;i++) { intarray[i] = scanner.nextInt(); } scanner.close(); for(int i=0;i<intarray.length-1;i++) { for(int j=0;j<intarray.length-i-1;j++) { if(intarray[j]>intarray[j+1]) { int t=intarray[j]; intarray[j]=intarray[j+1]; intarray[j+1]=t; } } } System.out.println("冒泡排序的结果为"); for(int i=0;i<intarray.length;i++) { System.out.print(intarray[i]+" "); } }
选择排序
所谓选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”,找最大值也可以。
以下述为例:
从中寻找最小的数——1,然后把‘1’放到最左边;
在从为排序的区域选择最小值.......以此类推;
第一轮找最小值需要比较(n-1)个数字,第二轮找最小值需要比较(n-2)个数字........第n-1轮找最小值只需找一个数字,和冒泡排序相同都是:(n-1)+(n-2)+......+1约为n^2/2。
时间复杂度也为n^2;
代码实现如下:
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] arrays; System.out.println("请输入数组的大小"); int n = scanner.nextInt(); arrays = new int [9]; System.out.println("请输入"+arrays.length+"个数字"); for(int i=0;i<arrays.length;i++) { arrays[i] = scanner.nextInt(); } scanner.close(); selectsort(arrays); System.out.println("从小到大依次为"); for(int i=0;i<arrays.length;i++) { System.out.print(arrays[i]+" "); } } public static void selectsort(int[] arrays) { for(int i=0;i<arrays.length;i++) { int min = i; for(int j=i;j<arrays.length;j++) { if(arrays[min]>arrays[j]) { min=j; } } if(min!=i) { int t = arrays[i]; arrays[i] = arrays[min]; arrays[min] = t; } } }
快速排序
快速排序会在序列之中随机选择一个基准值(pivot),然后将基准值以外的数,分为“比基准值大的数”和“比基准值小的数”两部分。
[比基准值小的数] 基准值 [比基准值大的数]
接着对两个“[]”中的数据进行排序,对"[]"里面的数据也是同样的方法。
以下图为例:
以数组最后的值为基准值,然后开始比较如果left比pivot小则往后移动;
直到碰到的数字比pivot大看right;
开始比较right和pivot,如果right>pivot则向前移动,直到遇到比pivot小的数。
之后交换left和right的位置,
之后再开始移动left,如果left<pivot则向后移动,直到遇到right停止。(注意先移动left)
交换left(right)和pivot的位置,之后这个数组将会被分割,这时从前面的“[]”开始循环上述的步骤;
如果left<pivot则往后移,right>pivot则前移,反之则交换位置;
交换完后:
这里pivot为最大值,所以left在遇到right时不会停止移动(这里与right不同),而是接着向后移动直到与pivot相遇,所以该操作并不需要移动。
这里因为left>pivot,所以锁定,right与left碰撞,之后和pivot交换位置。以此类推;
到最后一个“[]”;
根据上述操作排序即可。