冒泡排序和选择排序

package arithmetic;

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

public class BubbleSort {
	public static void main(String args[]){
		//BubbleSort bubble=new BubbleSort();
		int [] arr=new int[] {12,123,1232,11,12,2,2};
		arr=bubbleSort(arr);
		//遍历数组的一种方法
		for(int i:arr){
			System.out.println(i);
		}
		/*
		 *
		 //list 转换成数组
		 List list = new ArrayList();
		 list.add("1");
		 list.add("2");
		 final int size =list.size();
		 String[] arr = (String[])list.toArray(new String[size]);
		 for(String i:arr){
			 System.out.println(i);
		 }
		*/
		
		/*数组转list
		List list=Arrays.asList(arr);
		for(int i=0;i<list.size();i++){
			System.out.println(list.get(i));
		}
		*/
	}
	
	
	//冒泡排序,最佳时间是O(n),时间复杂度是O(n*n),
	public static int[] bubbleSort(int[] list){
		boolean needNextPass=true;//下一次遍历是否执行的标识
		
		for(int k=1;k<list.length;k++){
			needNextPass=false;//如果没有交换,说明所有元素已经排好了,那么下一次遍历就不用执行
			for(int i=0;i<list.length-k;i++){
				if(list[i]>list[i+1]){
					int temp=list[i];
					list[i]=list[i+1];
					list[i+1]=temp;
										
					needNextPass=true;//下一次遍历仍然需要
					
				}
			}
		}
		return list;
	}
}

 

  选择排序,就是从一堆数中选择一个最小的,然后增加到一个新的数组中,这个新的数组最开始是空的。那么可想而知,从一堆数中找到最小的数,成为这个算法的核心部分,这个有点像冒泡,但是又不是冒泡,冒泡是涉及到了很多交换,而选择只是用一个游标来标记最小数的下标,确定这个游标 所指的数值,然后和新数组的接下来的一个位置进行交换,这样就可以确定新数组中的每个数都比旧数组中的数要小。这种实现减少了频繁的交换操作。这样的话,不难看出,需要两个for循环,外层的for表示需要确定位置的个数,比如三个数进行选择排序,那么需要确定两个位置就行了,第三个就明显得出,第二个for是用来取出 旧数组最小的数。于是,很容易得到以下核心部分的代码:

package arithmetic;

import java.util.Arrays;

/*选择排序,就是从一堆数中选择一个最小的,然后增加到一个新的数组中,这个新的数组最开始是空的。那么可想而知,从一堆数中找到最小的数,
 * 成为这个算法的核心部分,这个有点像冒泡,但是又不是冒泡,冒泡是涉及到了很多交换,而选择只是用一个游标来标记最小数的下标,确定这个游标
 * 所指的数值,然后和新数组的接下来的一个位置进行交换,这样就可以确定新数组中的每个数都比旧数组中的数要小。这种实现减少了频繁的交换操作。这样的话,不难看出,需要两个
 * for循环,外层的for表示需要确定位置的个数,比如三个数进行选择排序,那么需要确定两个位置就行了,第三个就明显得出,第二个for是用来取出
 * 旧数组最小的数。于是,很容易得到以下核心部分的代码:
 */
public class ChooseSort {

	public static void main(String[] args){
		int [] arr=new int[] {12,123,1232,11,12,2,2};
		System.out.println("排序之前"+Arrays.toString(arr));
		sort(arr);
		System.out.println("排序之后"+Arrays.toString(arr));
		
	}
	public static void sort(int[] arr){
		for(int i=0;i<arr.length;i++){
			int minIndex=i;//设置一个游标,这个游标来指示最小数

			for(int k=i+1;k<arr.length;k++){
				//和最小数进行比较,不断更新,最终获得旧数组中的最小数,用游标记下最小数的下表
				if(arr[minIndex]>arr[k]){
					minIndex=k;
				}
			}
		//将最小数和新数组中接下来的一个位置的数进行交换
			if(minIndex!=i){
				int temp=arr[i];
				arr[i]=arr[minIndex];
				arr[minIndex]=temp;
			}
		}
	}
}
  但是,选择排序是不稳定,为什么不稳定呢?比如利用选择排序来排列下面的一组数:3,2,5,3,1,很容易知道,第一次的过后,第一个3会和1交换,那么这样,第一个3和第二3的位置就变换了,后来也不会再变回来了,所以,对于两个相等的数,在排序中前后位置如果在排序过后会改变,那么这种排序就是不稳定的。
### 冒泡排序选择排序的区别及实现原理 #### 1. 冒泡排序的实现原理 冒泡排序是一种简单的排序算法,其核心思想是比较相邻的元素。如果前一个元素比后一个元素大,则交换它们的位置。通过多次遍历数组,每次都将未排序部分的最大值“冒泡”到数组末尾[^4]。 以下是冒泡排序的代码实现: ```c void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` #### 2. 选择排序的实现原理 选择排序的核心思想是每一轮从待排序部分中找到最小值(或最大值),并将其放到已排序部分的末尾[^4]。具体来说,它通过比较每个元素与当前已知最小值进行交换来完成排序。 以下是选择排序的代码实现: ```c void selection_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { int min_index = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[min_index]) { min_index = j; } } if (min_index != i) { int temp = arr[i]; arr[i] = arr[min_index]; arr[min_index] = temp; } } } ``` #### 3. 冒泡排序选择排序的区别 - **比较次数**:两种排序方法在最坏情况下的比较次数相同,均为 \(O(n^2)\)[^1]。 - **交换次数**:冒泡排序在每次比较时可能会发生交换,而选择排序仅在每轮结束时发生一次交换。因此,选择排序的交换次数通常较少[^1]。 - **稳定性**:冒泡排序是稳定的排序算法,而选择排序不是稳定排序算法[^3]。 - **内层循环表达方式**:冒泡排序的内层循环是基于相邻元素的比较,而选择排序的内层循环是从当前元素开始寻找最小值[^3]。 - **实现逻辑**:冒泡排序通过“冒泡”的方式将最大值移动到数组末尾,而选择排序通过“选择”最小值将其放置到正确位置[^2]。 #### 4. 时间复杂度与空间复杂度 - **时间复杂度**:两者的时间复杂度均为 \(O(n^2)\),但在实际应用中,选择排序可能稍快一些,因为它的交换次数更少[^1]。 - **空间复杂度**:两者都是原地排序算法,空间复杂度为 \(O(1)\)[^2]。 ### 总结 冒泡排序选择排序虽然都属于简单排序算法,但其实现方式性能特点有所不同。冒泡排序更适合需要稳定性的场景,而选择排序则在交换次数上具有优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值