Java-18:冒泡排序,选择排序,快速排序

以下为冒泡排序,选择排序,快速排序的简单实现代码,略做记录:

(1)冒泡排序,参考:

https://www.cnblogs.com/LearnAndGet/p/10237399.html

(2)选择排序,参考:

https://www.cnblogs.com/remainsu/p/java-xuan-ze-pai-xu.html

https://blog.csdn.net/cricket_7/article/details/91778089

(3)快速排序,参考:

https://blog.csdn.net/qq_38741971/article/details/81661144

https://blog.csdn.net/shujuelin/article/details/82423852

 

--第一部分:源码

package org.szxu.sort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class SortAlgorithm {
	
	public static void main(String[] args) {
		/*
		List<Integer> list = new SortAlgorithm().GetUserInput();
		
		List<Integer> list1 = new SortAlgorithm().initList();
		*/
		
		/*int[] array = new int[] {6,1,2,7,9,3,4,5,10,8};
		new SortAlgorithm().fastSort(array, 0, array.length - 1);*/
		
		int[] array = new int[] {6,1,2,7,9,3,4,5,10,8};
		new SortAlgorithm().selectSort(array);
	}
	
	//获取IO输入的整数列表
	public List<Integer> GetUserInput(){
		Scanner sc = new Scanner(System.in);
		String input = sc.nextLine();
		//System.out.print(input);
		
		//String[] stringArray = input.split("\\||\\^|@");  //split说明:正则符号 | ^  .  :  *等必须转义,使用“\\”;而分割符号用“|”
		String[] strArray = input.split(" ");
		List<String> list3 = Arrays.asList(strArray);
		
		List<Integer> list4 = new ArrayList<Integer>();
		list3.forEach(i -> list4.add(Integer.valueOf(i)));   //字符串list转整形list
		
		System.out.print(list4);
		
		return list4;
	}
	
	//初始化list
	public List<Integer> initList() {
		//列表初始化方式1:
		List<Integer> list = new ArrayList<Integer>();
		for(int i=10; i > 0; i--){
			list.add(i);
		}
		
		//列表初始化方式2:
		List<Integer> list1 = Arrays.asList(10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
				
		//列表初始化方式3:外层{}定义了arraylist匿名内部类。内层{}定义了一个实例初始化代码块。
		List<Integer> list2 = new ArrayList<Integer>() {{
			add(10); add(9); add(8); add(7); add(6);
			add(5);  add(4); add(3); add(2); add(1);
		}};
		
		//列表初始化方式5:数组转list
		int[] intArray = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
		List<int[]> list5 = Arrays.asList(intArray);
		Integer[] intArray1 = new Integer[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
		List<Integer> list5_1 = Arrays.asList(intArray1);
		
		return list5_1;
	}
	
	
	//冒泡排序(while循环)
	public void bubbleSort_1(int[] array) {
		if(array == null || array.length <= 0) {
			return; 
		}
		
		int i = 0;
		int j = 1;
		boolean flag = true;
		int length = array.length;
		while(flag) {
			i = 0;
			flag = false;
			while(i < length - j) {
   				if(array[i] > array[i + 1]) {
					array[i] += array[i+1];
					array[i+1] = array[i] - array[i+1];
					array[i] = array[i] - array[i+1];
					
					flag = true;
				}
				
				i++;
			}
			
			j++;
		}
		
		//System.out.print(Arrays.asList(array));
	}
	
	//冒泡排序
	public void bubbleSort_2(int[] array) {
		if(array == null || array.length <= 0) {
			return; 
		}
		
		int tmp = 0;
		int length = array.length;
		
		for(int i = 0; i < length-1; i++) {  //第一层for控制循环趟数
			
			boolean flag = false;
			
			for(int j = 0; j < length - 1 - i; j++) { //第二层for控制一趟还需循环多少次
				if(array[j] > array[j + 1]) {
					tmp = array[j];
					array[j] = array[j+1];
					array[j+1] = tmp;
					
					flag = true;
				}
			}
			
			if(flag == false){
				break;
			}
		}
		
		//System.out.print(Arrays.asList(array));
	}
	
	
	//选择排序
	public void selectSort(int[] array){
		if(array == null || array.length <= 0) {
			return; 
		}
		
		int tmp = 0;
		int length = array.length;	
		int minIdx = 0;
		boolean flag = false;
		for(int i = 0; i < length - 1; i++ ) {
			
			minIdx = i;
			flag = false;
		
			for(int j = i + 1; j < length; j++) {
				if(array[minIdx] > array[j]) {
					minIdx = j;
					flag = true;
				}
			}
			
			if(true == flag) {
				tmp = array[i];
				array[i] = array[minIdx];
				array[minIdx] = tmp;
			}
		}
		
		//System.out.print(Arrays.asList(array));
	}
	
	
	//快速排序
	public void fastSort(int[] array, int left, int right) {
		if(array == null || array.length <= 0 || left > right) {
			return;
		}
		
		int tmp = array[left];
		int i = left;
		int j = right;
		while(i != j) {
			//一定要先从右边开始找 ,直到找到一个小于基准的值
			while(array[j] >= tmp && i < j) {
				j--;
			}
			
			//然后从左边找,直到找到一个大于基准的值
			while(array[i] <= tmp && i < j) {
				i++;
			}
			
			if(i < j) {
				array[i] += array[j];
				array[j] = array[i] - array[j];
				array[i] = array[i] - array[j];
			}
		}
		
		//将基准数归位(重要)
		array[left] = array[i];
		array[i] = tmp;
		
		if(left < i - 1) {
			fastSort(array, left, i - 1);  //将会优先递归左侧区域,然后是对应的右侧区域
		}
		
		if(i + 1 < right) {
			fastSort(array, i+1, right);
		}   
	}
}

 

--第二部分:测试 - junit:新建项目 - 新建包 - 添加junit的lib - 模仿模板方法写测试代码(可断点,但是貌似不能进入测试方法)

package org.szxu.sort;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;

public class SortAlgorithmTest {

    /*@Test
    public void selectSort() {
        int[] sourseArray = new int[] {10,9,8,7,6,5,4,3,2,1};
        new SortAlgorithm().selectSort(sourseArray);
        
        int[] expectedArray = new int[] {1,2,3,4,5,6,7,8,9,10};
        assertArrayEquals(expectedArray, sourseArray);
    }
    
    @Test
    public void selectBubble_1() {
        int[] sourseArray = new int[] {10,9,8,7,6,5,4,3,2,1};
        new SortAlgorithm().bubbleSort_1(sourseArray);
        
        int[] expectedArray = new int[] {1,2,3,4,5,6,7,8,9,10};
        assertArrayEquals(expectedArray, sourseArray);
    }

    @Test
    public void BubbleSort_2() {
        int[] sourseArray = new int[] {10,9,8,7,6,5,4,3,2,1};
        new SortAlgorithm().bubbleSort_2(sourseArray);
        
        int[] expectedArray = new int[] {1,2,3,4,5,6,7,8,9,10};
        assertArrayEquals(expectedArray, sourseArray);
    }
    */
    
    @Test
    public void fastSort() {
        int[] sourseArray = new int[] {10,9,8,7,6,5,4,3,2,1};
        new SortAlgorithm().fastSort(sourseArray, 0, sourseArray.length - 1);
        
        int[] expectedArray = new int[] {1,2,3,4,5,6,7,8,9,10};
        assertArrayEquals(expectedArray, sourseArray);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值