排序算法

本文深入讲解了三种排序算法:冒泡排序、快速排序和选择排序的原理与实现。通过具体的代码示例,详细分析了每种算法的最佳、最差及平均时间复杂度,帮助读者理解算法的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序算法

自己码的代码,亲测可以直接运行

冒泡排序

  • 原理:

比较相邻的元素。如果第一个比第二个大,就交换它们两个。

  • 算法分析

最佳情况:T(n) = O(n) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)

/**
	 * 冒泡排序
	 */
	public void bobSort() {
		for (int i = 0; i < length - 1; i++) {// 排序轮数
			for (int j = 0; j < length - 1; j++) {// 比较次数
				if (array[j] > array[j + 1]) {
					int temp = array[j + 1];
					array[j + 1] = array[j];
					array[j] = temp;
				}
			}
		}
	}

快速排序

  • 原理:

通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

  • 算法分析

最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(nlogn)

   /**
    	 * 快速排序
    	 */
    	public static void quickSort(int array[], int low, int high) {		
    		// 1,找到递归算法的出口
    		if (low > high) {
    			return;
    		}
    		// 2, 存
    		int i = low;
    		int j = high;
    		// 3,key
    		int key = array[low];
    		// 4,完成一趟排序
    		while (i < j) {
    			// 4.1 ,从右往左找到第一个小于key的数
    			while (i < j && array[j] > key) {
    				j--;
    			}
    			// 4.2 从左往右找到第一个大于key的数
    			while (i < j && array[i] <= key) {
    				i++;
    			}
    			// 4.3 交换
    			if (i < j) {
    				int p = array[i];
    				array[i] = array[j];
    				array[j] = p;
    			}
    		}
    		// 4.4,调整key的位置
    		int p = array[i];
    		array[i] = array[low];
    		array[low] = p;
    		// 5, 对key左边的数快排
    		quickSort(array, low, i - 1);
    		// 6, 对key右边的数快排
    		quickSort(array, i + 1, high);
    	}

选择排序

  • 原理:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

  • 算法分析

最佳情况:T(n) = O(n2) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2)

/**
	 * 选择排序
	 */
	public static void bubbleSort(int array[]){
		int len=array.length;
	    for (int i=0 ; i<len-1 ; i++){
	        for(int j=0 ; j<len-1-i ; j++){
	            if(array[j]>array[j+1]){
	                int temp = array[j];
	                array[j] = array[j+1];
	                array[j+1] = temp;
	            }
	        }
	    }
	    
	}

源码

package com.demo.test;

public class SortTest {

	private int[] array;
	private int length;

	/**
	 * 构造函数
	 * 
	 * @param array
	 */
	public SortTest(int[] array) {
		this.array = array;
		this.length = array.length;
	}

	/**
	 * 打印数组中数据
	 */
	public void display(int[] array) {
		for (int i : array) {
			System.out.print(i + " ");
		}
		System.out.println();
	}

	/**
	 * 冒泡排序
	 */
	public void bobSort() {
		for (int i = 0; i < length - 1; i++) {// 排序轮数
			for (int j = 0; j < length - 1; j++) {// 比较次数
				if (array[j] > array[j + 1]) {
					int temp = array[j + 1];
					array[j + 1] = array[j];
					array[j] = temp;
				}
			}
		}
	}

	/**
	 * 快速排序
	 */
	public static void quickSort(int array[], int low, int high) {		
		// 1,找到递归算法的出口
		if (low > high) {
			return;
		}
		// 2, 存
		int i = low;
		int j = high;
		// 3,key
		int key = array[low];
		// 4,完成一趟排序
		while (i < j) {
			// 4.1 ,从右往左找到第一个小于key的数
			while (i < j && array[j] > key) {
				j--;
			}
			// 4.2 从左往右找到第一个大于key的数
			while (i < j && array[i] <= key) {
				i++;
			}
			// 4.3 交换
			if (i < j) {
				int p = array[i];
				array[i] = array[j];
				array[j] = p;
			}
		}
		// 4.4,调整key的位置
		int p = array[i];
		array[i] = array[low];
		array[low] = p;
		// 5, 对key左边的数快排
		quickSort(array, low, i - 1);
		// 6, 对key右边的数快排
		quickSort(array, i + 1, high);
	}

	public static void main(String[] args) {
		int[] array = { 77, 29, 28, 36, 33, 25, 10 };
		SortTest bobSort = new SortTest(array);
		System.out.println("冒泡排序前的数据为:");
		bobSort.display(array);
		
		bobSort.bobSort();		
		
		System.out.println("冒泡排序后的数据为:");
		bobSort.display(array);
		
		int[] array1 = { 77, 29, 28, 36, 33, 25, 10 };
		SortTest bobSort1 = new SortTest(array1);
		System.out.println("快速排序前的数据为:");
		bobSort1.display(array1);
		quickSort(array1,0,array1.length-1);
		System.out.println("快速排序后的数据为:");
		bobSort.display(array1);
		
        int[] array2 = { 78, 28, 26, 36, 33, 25, 11 };
		SortTest bobSort2 = new SortTest(array2);
		System.out.println("选择排序前的数据为:");
		bobSort2.display(array2);
	
	    bubbleSort(array2);		
	
		System.out.println("选择排序后的数据为:");
		bobSort2.display(array2);
}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值