冒泡排序
其实冒泡排序很好玩也很简单,来吧展示吧!
冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。
冒泡排序的步骤是比较固定的:
算法思想:
1>比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2>每趟从第一对相邻元素开始,对每一对相邻元素作同样的工作,直到最后一对。
3>针对所有的元素重复以上的步骤,除了已排序过的元素(每趟排序后的最后一个元素),直到没有任何一对数字需要比较
冒泡排序的常规实现代码如下:
/**
* 冒泡排序
*/
public static void main(String[] args) {
Random random = new Random();
int[] arr =new int[10];
for (int i = 0; i <arr.length ; i++) {
int n =random.nextInt(201);
arr[i]=n;
}
System.out.println("随机0-200之间的数"+Arrays.toString(arr));
//排序的大小
for (int i = 0; i <arr.length-1 ; i++) {
for (int j = 0; j <arr.length-1-i ; j++) {
if(arr[j]>arr[j+1]){
arr[j]=arr[j]^arr[j+1];
arr[j+1]=arr[j]^arr[j+1];
arr[j]=arr[j]^arr[j+1];
}
}
}
System.out.println("排列好的数:"+Arrays.toString(arr));
}
应为我这边是定义的随机数生成所以就不展示输出效果图了。
冒泡排序有三种特性:
稳定性:
在冒泡排序中,遇到相等的值,是不进行交换的,只有遇到不相等的值才进行交换,所以是稳定的排序方式。
复杂度:
如果待排序序列的初始状态恰好是我们希望的排序结果(如升序或降序),一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:
冒泡排序最好的时间复杂度为O(n)。
如果待排序序列是反序(如我们希望的结果是升序,待排序序列是降序)的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
冒泡排序的最坏时间复杂度为O(n2)。
综上,因此冒泡排序总的平均时间复杂度为O(n2)。
适用场景:
冒泡排序适用于数据量很小的排序场景,因为冒泡的实现方式较为简单。
选择排序
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。
步骤:
算法思想:
A.在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
B.从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
C.以此类推,直到所有元素均排序完毕。
public static void main(String[] args) {
//定义一个0-200之间的随机数
Random random = new Random();
int[] arr =new int[4];
for (int i = 0; i <arr.length ; i++) {
int n =random.nextInt(201);
arr[i]=n;
}
System.out.println("随机0-200之间的数"+ Arrays.toString(arr));
//最外层循环
for (int i = 0; i < arr.length-1; i++) {
//获取index最小值位置
int index=i;
for (int j = i+1; j <arr.length ; j++) {
if(arr[index]>arr[j]){
index=j;
}
}
//判断是第一个数否是最大的,如果是就交换不是则不换
if(index!=i){
arr[index]=arr[index]^arr[i];
arr[i]=arr[index]^arr[i];
arr[index]=arr[index]^arr[i];
}
}
System.out.println("排完序的数"+ Arrays.toString(arr));
}