排序算法和冒泡排序法

今天学习了Java数组中的排序方法,在Java数组种使用冒泡排序的方法进行排序。其本质是嵌套循环使一个元素与其身后的另一个元素进行比较,然后交换位置

排序算法

Java中的常见排序算法有:冒泡、插入、选择、快速、希尔、归并、堆7种 。

  1. 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
  2. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
    构建一个乱序的数组用于进行排序:
int[] arr=new int[6];//数据必须是可比较的,否则不能进行排序
Random r=new Random();
for(int i=0;i<arr.length;i++)
 arr[i]=r.nextInt(100);

冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为每趟比较将当前数列未排序部分的最大的元素“沉”到数列末端,而小的元素会经由交换慢慢“浮”到数列

for(int i=1;i<arr.length;i++){
    
    //用于控制比较次数
 for(int k=0;k<arr.length-i;k++){
    
    
 if(arr[k]>arr[k+1]){
    
    
 int temp=arr[k];
 arr[k]=arr[k+1];
 arr[k+1]=temp;
 }
 }
}

循环执行次数:(n-1)+(n-2)+(…)+(1)=(n*n-n)/2
平均时间复杂度为O(n平方) 空间复杂度O(1) 稳定的排序算法
键盘录入多个整数,点e表示输入完成,将所有录入数据放入数组,然后进行从大到小排序显示自定义方法,用于实现向数组中追加数据,并且将原始数组长度加1

public static int[] add(int[] source, int num) {
    
    
 int[] res = new int[source.length + 1];//新建数组,这个就是边长之后的数组,用于
新增数据
 for (int i = 0; i < source.length; i++)//拷贝原始数组中的数据到新数组中
 res[i] = source[i];
 res[source.length] = num;//新数组最后一个位置存放需要追加的数据
 return res;//返回新创建的数组到方法调用的地方
}

自定义方法,用于实现指定数组的排序

public static void sort(int[] source){
    
    //用于实现数组排序
 for(int i=1;i<source.length;i++){
    
    //控制比对的圈数
 for(int k=0;k<source.length-i;k++){
    
    //控制一圈比对中的具体比对操作
 if(source[k]<source[k+1]){
    
    
 int temp=source[k];
 source[k]=source[k+1];
 source[k+1]=temp;
 }
 }
 }
}

主方法:调用上面定义的方法完成对应的处理功能

public static void main(String[] args) {
    
    
 Scanner sc = new Scanner(System.in);//指代键盘的的对象,可以获取用户输入的数据
 int counter = 1;//统计输入数据个数
 System.out.print("请输入第" + counter++ + "个整数:");
 String str = sc.nextLine();
 int[] arr = new int[0];//不知道需要多长的数组所以先定义0个长的数组,每添加一个数据,数组长度加1
 while (!str.startsWith("e")) {
    
    //如果用户输入e开头的内容则执行结束
 int kk = Integer.parseInt(str.trim());//进行数据类型转换,将输入的String类型数据转换为int类型
 arr = add(arr, kk);//调用上面的方法对数据进行变长,并添加新增数据到数组末尾
 System.out.print("请输入第" + counter++ + "个整数:");
 str = sc.nextLine();
 }
 sort(arr);调用上面的方法进行排序
 for (int temp : arr)
 System.out.print(temp + "\t");
}

从键盘录入一行字符串,使用逗号作为分隔符,将字串分割成多端,然后按照字母序进行排序后显示

public static int[] add(int[] source, int num) {
    
    
 int[] res = new int[source.length + 1];//新建数组,这个就是边长之后的数组,用于
新增数据
 for (int i = 0; i < source.length; i++)//拷贝原始数组中的数据到新数组中
 res[i] = source[i];
 res[source.length] = num;//新数组最后一个位置存放需要追加的数据
 return res;//返回新创建的数组到方法调用的地方
}
public static void sort(int[] source){
    
    //用于实现数组排序
 for(int i=1;i<source.length;i++){
    
    //控制比对的圈数
 for(int k=0;k<source.length-i;k++){
    
    //控制一圈比对中的具体比对操作
 if(source[k]<source[k+1]){
    
    
 int temp=source[k];
 source[k]=source[k+1];
 source[k+1]=temp;
 }
 }
 }
}

public static void main(String[] args) {
    
    
 Scanner sc = new Scanner(System.in);//指代键盘的的对象,可以获取用户输入的数据
 int counter = 1;//统计输入数据个数
 System.out.print("请输入第" + counter++ + "个整数:");
 String str = sc.nextLine();
 int[] arr = new int[0];//不知道需要多长的数组所以先定义0个长的数组,每添加一个数据,数组长度加1
 while (!str.startsWith("e")) {
    
    //如果用户输入e开头的内容则执行结束
 int kk = Integer.parseInt(str.trim());//进行数据类型转换,将输入的String类型数据转换为int类型
 arr = add(arr, kk);//调用上面的方法对数据进行变长,并添加新增数据到数组末尾
 System.out.print("请输入第" + counter++ + "个整数:");
 str = sc.nextLine();
 }
 sort(arr);//调用上面的方法进行排序
 for (int temp : arr)
 System.out.print(temp + "\t");
//补充:字符串的比对是通过字符串中每个字符的Unicode编码值进行比较,如果返回值为正数,则表示
//前面的大于后面的,如果为0则表示相等;如果为负数则表示前面的小于后面的

猜你喜欢

转载自blog.csdn.net/Lecheng_/article/details/112498267