MOYUN(/Java/SQL/Linux/DevOps/运维/架构/管理/敏捷/开发)

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、选择排序简介

  选择排序原理:    

  第一次,拿0索引原始和后面的所有原始进行比较,小的往前放,第一次完毕,最小值出现在了最小索引处。
  第二次,拿1索引原始和后面的所有原始进行比较,小的往前放,第二次完毕,次小值出现在了次小索引处。

  即:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换。第二次从R[1]~R[n-1]中选取最小值与R[1]交换。。。以此类推。通俗点说就是每次找到后面元素的最小值然后与之交换

  定义待排序的数组  int[] arr = { 24, 69, 80, 57, 13 };

  代码实现:

	public static void main(String[] args) {
		// 定义数组
		int[] arr = { 24, 69, 80, 57, 13 };
		
		// 选择排序
		selectSort(arr);
		
		// 遍历数组
		printArray(arr);
		
		
	}
	
	// 选择排序
	public static void selectSort(int[] arr) {
		for (int x = 0; x < arr.length - 1; x++) {
			for (int y = x + 1; y < arr.length; y++) {
				if (arr[y] < arr[x]) {
					int temp = arr[x];
					arr[x] = arr[y];
					arr[y] = temp;
				}
			}
		}
	}
	
	// 遍历数组
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]);
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
		System.out.println("]");
	}

  

  输出结果 

[13, 24, 57, 69, 80]

 

  
  
  选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。")选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。从算法逻辑上看,选择排序是一种简单直观的排序算法,在简单选择排序过程中,所需移动记录的次数比较少。

  选择排序的基本思想:比较 + 交换。在未排序序列中找到最小(大)元素,存放到未排序序列的起始位置。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。①. 从待排序序列中,找到关键字最小的元素; ②. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换; ③. 从余下的 N - 1 个元素中,找出关键字最小的元素,重复①、②步,直到排序结束。以下是选择排序复杂度:

平均时间复杂度最好情况最坏情况空间复杂度
O(n²) O(n²) O(n²) O(1)

 选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间.

 

二、冒泡排序简介

  基本思想  

    冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序是我们得最多的排序方式之一,原因是简单易实现,且原理易懂。顾名思义,冒泡排序,它的排序过程就像水中的气泡一样,一个一个上浮到水面。

   

  

 算法描述

   ①. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
   ②. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
   ③. 针对所有的元素重复以上的步骤,除了最后一个。
   ④. 持续每次对越来越少的元素重复上面的步骤①~③,直到没有任何一对数字需要比较

 

 代码实现

  相邻元素两两比较。大的往后放,第一次比较完成后,最大值出现在最大索引处。冒泡排序需要两个嵌套的循环,

  

	public static void main(String[] args) {
		int[] arr = { 24, 69, 80, 57, 13 };
		sortBubbo(arr);
		printArray(arr);
	}
	
	//从小到大排序
	public static void sortBubbo(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;
				}
			}
		}
	}
	

	
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]);
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
		System.out.println("]");
	}

  

以下是冒泡排序算法复杂度:

平均时间复杂度最好情况最坏情况空间复杂度
O(n²) O(n) O(n²) O(1)

冒泡排序是最容易实现的排序, 最坏的情况是每次都需要交换, 共需遍历并交换将近n²/2次, 时间复杂度为O(n²). 最佳的情况是内循环遍历一次后发现排序是对的, 因此退出循环, 时间复杂度为O(n). 平均来讲, 时间复杂度为O(n²). 由于冒泡排序中只有缓存的temp变量需要内存空间, 因此空间复杂度为常量O(1).

Tips: 由于冒泡排序只在相邻元素大小不符合要求时才调换他们的位置, 它并不改变相同元素之间的相对顺序, 因此它是稳定的排序算法.

 

posted on 2020-02-16 17:00  moyun-  阅读(191)  评论(0编辑  收藏  举报