《数据结构与算法》之排序算法(冒泡排序、选择排序)

排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。

排序算法分类

一、非线性时间比较类排序

1、交换排序(冒泡排序、快速排序)

2、插入排序(简单插入排序、布尔排序)

3、选择排序(简单选择排序、堆排序)

4、归并排序(二路归并排序、多路归并排序)

二、线性时间非比较类排序

1、计数排序

2、桶排序

3、基数排序

各排序算法的比较:

排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性
插入排序 O(n^2 O(n^2 O(n O(1) 稳定
希尔排序 O(n^{1.3} O(n^2 O(n O(1) 不稳定
选择排序 O(n^2 O(n^2 O(n^2 O(1) 不稳定
堆排序 O(nlog_{2}n O(nlog_{2}n O(nlog_{2}n O(1) 不稳定
冒泡排序 O(n^2 O(n^2 O(n O(1) 稳定
快速排序 O(nlog_{2}n O(n^2 O(nlog_{2}n O(nlog_{2}n 不稳定
归并排序 O(nlog_{2}n O(nlog_{2}n O(nlog_{2}n O(n) 稳定
 
计数排序 O(n+k) O(n+k) O(n+k) O(n+k) 稳定
桶排序 O(n+k) O(n^2 O(n) O(n+k) 稳定
基数排序 O(n*k) O(n*k) O(n*k) O(n+k) 稳定

其中,

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。

时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。

空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

 排序算法实现:

1、冒泡排序

冒泡排序的运作规律如下:

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

(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数(也就是第一波冒泡完成)。

(3)针对所有的元素重复以上的步骤,除了最后一个。

(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

public class BubbleSort {
    
    //冒泡排序算法
	public static int[] sort(int[] array){
		//这里for循环表示总共需要比较多少轮
		for(int i = 1 ; i < array.length; i++){			
			//j的范围很关键,这个范围是在逐步缩小的,因为每轮比较都会将最大的放在右边
			for(int j = 0 ; j < array.length-i ; j++){
				if(array[j]>array[j+1]){
					int temp = array[j];
					array[j] = array[j+1];
					array[j+1] = temp;
				}
			}
		}
		return array;
	}
	
	//遍历显示数组
	public static void display(int[] array){
		for(int i = 0 ; i < array.length ; i++){
			System.out.print(array[i]+" ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		int[] array = {4,2,8,9,5,7,6,1,3};
		System.out.println("未排序数组顺序为:");
		display(array);
		array = sort(array);
		System.out.println("经过冒泡排序后的数组顺序为:");
		display(array);
	}

}

2、选择排序

选择排序(Selection-sort)的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

public class SelectionSort {

	public static void main(String[] args) {
		int[] array = { 4, 2, 8, 9, 5, 7, 6, 1, 3 };
		System.out.println("未排序数组顺序为:");
		display(array);
		array = selectionSort(array);
		System.out.println("经过选择排序后的数组顺序为:");
		display(array);
	}

	// 选择排序方法
	private static int[] selectionSort(int[] arr) {
		int len = arr.length;
		int minIndex, temp;
		for (int i = 0; i < len - 1; i++) {
			minIndex = i;
			for (int j = i + 1; j < len; j++) {
				if (arr[j] < arr[minIndex]) { // 寻找最小的数
					minIndex = j; // 将最小数的索引保存
				}
			}
			temp = arr[i];
			arr[i] = arr[minIndex];
			arr[minIndex] = temp;
		}
		return arr;
	}

	// 遍历显示数组
	public static void display(int[] array) {
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
		System.out.println();
	}
}

 

猜你喜欢

转载自blog.csdn.net/manbulaiyinhepan/article/details/83866268