赞
踩
近期对与java排序方法在进行学习,想着把自己学习的东西做个归纳整理。一个是分享给大家,共同学习,另一个是对自己后期的查阅也是一个便捷。排序其实就是一种算法逻辑的体现,好的算法,是从其时间复杂度、稳定性纬度来评价的。我本身也不是计算机专业的,总结的地方有问题,还请大家多多交流分享。
冒泡排序:是一种计算机科学领域的较简单基础的排序算法,通过排序之后,得到一个升序或者降序的排列。
其排序思想:给定一组无序的数组,从角标最小处开始,依次比较相邻的两个数,将较小的数放前面,较大的数放在后面,依次比较,直到最后的两个数据比较完成,那么数组中数值最大的元素就出现在数组最后的位置。重复比较,便可将数组中所有元素按照升序进行排列。
举例:有一个数组,使用冒泡排序进行升序。
角标 | 0 | 1 | 2 | 3 | 4 |
原始数组 | 32 | 23 | 65 | 52 | 11 |
第一轮次:
第一次:从角标0开始,和角标1对比,标黄色部分,大的放后面,小的方前面,32>23,两个数据进行交换,交换之后的数组如下图:,依次进行对比,直至最后两个元素进行对比之后,得到的数组如下:23,32,52,11,65。第一轮次,总共比较4次。
第一次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 65 | 52 | 11 | |
第二次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 65 | 52 | 11 | |
第三次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 52 | 65 | 11 | |
第四次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 52 | 11 | 65 |
第二轮次:
同第一轮次一样,相邻的两个元素进行比较,由于第一次已经得到了最大的数值了,所以最后不需要进行对比。具体对比情况如下,第二轮次一共比较3次,可以得到第二大的数值。
第一次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 52 | 11 | 65 | |
第二次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 52 | 11 | 65 | |
第三次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 11 | 52 | 65 |
第三轮次:
第三轮次一共比较2次,得到第三大的值,具体情况如下表:
第一次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 32 | 11 | 52 | 65 | |
第二次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 23 | 11 | 32 | 52 | 65 |
第四轮次:
第四轮次只需要比较剩余的两个数值,比较一次即可。得到最终的排序数组。
第一次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 11 | 23 | 32 | 52 | 65 |
Java程序实现方法:
- //定义主类
- public class Test {
- public static void main(String[] args) {
- //自定义一个无序的数组
- int [] arr = new int[]{32,23,65,52,11};
- System.out.println("冒泡排序前:");
- Test.printArray(arr);
- System.out.println("冒泡排序后:");
- Test.bubbleSort(arr);
- Test.printArray(arr);
- }
- //定义静态方法printArray,功能是用来遍历数组
- public static void printArray(int arr[]){
- System.out.print("[");
- for (int i = 0 ; i<arr.length;i++){
- if (i==arr.length-1){
- System.out.println(arr[i]+"]");
- }else{
- System.out.print(arr[i]+", ");
- }
- }
- }
- //定义冒泡bubbleSort
- public static void bubbleSort(int arr[]){
- for (int x = 0 ; x<arr.length-1;x++){
- for (int y = 0;y<arr.length-1-x;y++){
- if (arr[y]>arr[y+1]){
- int temp = arr[y];
- arr[y] = arr[y+1];
- arr[y+1] = temp;
- }
- }
- }
- }
- }
选择排序思想:它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
选择排序过程:
第一轮次:第一次,从角标0开始,和角标1进行比较,那个小,那个放在前面,32>23,两个进行交换,第二次,角标0和角标2对比,23<65,不用交换,一次进行比较,最终把最小的数值放在了角标0处,第一轮次一共比较4次。
第一轮次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 32 | 23 | 65 | 52 | 11 | |
第一次比较 | 23 | 32 | 65 | 52 | 11 | |
第二次比较 | 23 | 32 | 65 | 52 | 11 | |
第三次比较 | 23 | 32 | 65 | 52 | 11 | |
第四次比较 | 11 | 32 | 65 | 52 | 23 |
第二次轮次:第一次从角标1开始,和角标2对比,32<65,不用交换,第二次角标1和角标3对比,32<52,不用交换,第三次角标1和角标4的对比,32>23,进行交换。第二轮次一共比较3次。
第二轮次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 11 | 32 | 65 | 52 | 23 | |
第一次比较 | 11 | 32 | 65 | 52 | 23 | |
第二次比较 | 11 | 32 | 65 | 52 | 23 | |
第三次比较 | 11 | 23 | 65 | 52 | 32 |
第三轮次:比较2次
第三轮次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 11 | 23 | 65 | 52 | 32 | |
第一次比较 | 11 | 23 | 52 | 65 | 32 | |
第二次比较 | 11 | 23 | 32 | 65 | 52 |
第四轮次:比较1次
第四轮次 | 角标 | 0 | 1 | 2 | 3 | 4 |
数组 | 11 | 23 | 32 | 65 | 52 | |
第一次比较 | 11 | 23 | 32 | 52 | 65 |
Java程序实现方法:
- //定义主类
- public class Test {
- public static void main(String[] args) {
- //自定义一个无序的数组
- int [] arr = new int[]{32,23,65,52,11};
- System.out.println("选择排序前:");
- Test.printArray(arr);
- System.out.println("选择排序后:");
- Test.selectionSort(arr);
- Test.printArray(arr);
- }
- //定义静态方法printArray,功能是用来遍历数组
- public static void printArray(int arr[]){
- System.out.print("[");
- for (int i = 0 ; i<arr.length;i++){
- if (i==arr.length-1){
- System.out.println(arr[i]+"]");
- }else{
- System.out.print(arr[i]+", ");
- }
- }
- }
- //定义选择排序
- public static void selectionSort(int arr[]){
- for (int i = 0 ; i<arr.length;i++){
- for(int j = i+1 ;j<arr.length;j++){
- if(arr[i] > arr[j]){
- int temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
- }
- }
- }
插入排序:从第一个元素开始,该元素可以认为已经被排序,取出下一个元素,在已经排序的元素序列中从后向前扫描,如果该元素(已排序)大于新元素,将该元素移到下一位置,重复步骤,直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到该位置后,重新获取下一个元素,重复步骤。
举例说明:
原始数组:
角标 | 0 | 1 | 2 | 3 | 4 |
原始数组 | 32 | 23 | 65 | 52 | 11 |
第一个元素默认是已经被排序了,取出下一个元素,角标1的23,32>23,将角标0的32向后移动,此时的数组是:
角标 | 0 | 1 | 2 | 3 | 4 |
原始数组 | 32 | 23 | 65 | 52 | 11 |
第一次比较 | 23 | 32 | 65 | 52 | 1 |
此时角标0和角标1是有序的,取出下一个元素,角标2的65,和已排序的角标1和角标0对比,都比前面的大,保持不动,继续获取下一个元素,角标3的52,和已排序的角标2,1,0依次进行对比, 65>52,65向后移动一位,32<52,保持不动,把52插入到角标2处,此时的数组如下:
角标 | 0 | 1 | 2 | 3 | 4 |
原始数组 | 32 | 23 | 65 | 52 | 11 |
第一次比较 | 23 | 32 | 65 | 52 | 11 |
第二次比较 | 23 | 32 | 52 | 65 | 11 |
获取下一个元素,角标4的11,和角标3,2,1,0一次进行对比,比11大的往后移动一位,最终把11插入至角标0处。
角标 | 0 | 1 | 2 | 3 | 4 |
原始数组 | 32 | 23 | 65 | 52 | 11 |
第一次比较 | 23 | 32 | 65 | 52 | 11 |
第二次比较 | 23 | 32 | 52 | 65 | 11 |
第三次比较 | 11 | 23 | 32 | 52 | 65 |
java程序实现方法:
- //定义主类
- public class Test {
- public static void main(String[] args) {
- //自定义一个无序的数组
- int [] arr = new int[]{32,23,65,52,11};
- System.out.println("选择排序前:");
- Test.printArray(arr);
- System.out.println("选择排序后:");
- Test.insertSort(arr);
- Test.printArray(arr);
- }
- //定义静态方法printArray,功能是用来遍历数组
- public static void printArray(int arr[]){
- System.out.print("[");
- for (int i = 0 ; i<arr.length;i++){
- if (i==arr.length-1){
- System.out.println(arr[i]+"]");
- }else{
- System.out.print(arr[i]+", ");
- }
- }
- }
- // 插入排序方法
- public static void insertSort(int arr[]){
- for(int i = 1 ;i<arr.length;i++){
- int j = i;
- int temp = arr[i];
- while (j>0 && temp<arr[j-1]){
- arr[j] = arr[j-1];
- j--;
- }
- arr[j] = temp;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。