java数据结构 1.交换排序

1.1冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。

思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

代码:

public static void main(String[] args) {
    int[] arr={6,3,8,2,9,1};
    System.out.println("排序前数组为:");
    for(int num:arr){
      System.out.print(num+" ");
    }
    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]){
          int temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        }
      }
    } 
    System.out.println();
    System.out.println("排序后的数组为:");
     for(int num:arr){
       System.out.print(num+" ");
     } 
  }

冒泡排序就是一个双层循环, 外层循环控制排序趟数,内层循环控制每一趟排序多少次

for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
      for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次

1.2快速排序

原理:

快速排序思路是使数组中的每个元素与基准值(左边第一个值)比较,数组中比基准值小的放在基准值的左边;大的放在右边;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边。。。直到排序结束。

注意:

当你定义最左边为基准值时 就要右边的数值先动 反之亦然

参考 7 5 6 8 9  (即7 处于左边最后要和一个比他的小的数交换回来 而这个比他小的数一定来自他的右边)

变量声明代码: 

 static Integer[] integer;
 static Scanner sc;

 主方法:


        public static void main(String[] args) {
            integer=new Integer[10];
            System.out.println("生成随机数组......");
            for(int i=0;i<10;i++){
                integer[i]=(int)(Math.random()*100);
            }
            for (int i:integer) {
                System.out.print(i+" ");
            }
            System.out.println();
            System.out.println("*************************************************");
            System.out.println("排序......");
            quicksort(0,9);
            for (int i:integer) {
                System.out.print(i+" ");
            }
        }

 快排的方法代码:


         public static void quicksort(int left,int right){//快排实现过程
        //    递归出口
            if(left>right)
                return;
        //    先把这几个数据储存起来就不会丢失了 因为一会要做运算
            int temp = integer[left], m = left, n = right; 
        //    排除递归最后一次相当时的运算
            while (m != n) {
                while (integer[n] >= temp && m < n)
                    n--;//找到右边比第一个数小的坐标 和第一个数交换
                integer[m] = integer[n];
                while (integer[m] <= temp && m < n)
                    m++;//找到左边比第一个数大的坐标 和刚才的小数交换
                integer[n] = integer[m];
            }
            integer[m] = temp;//第一个数的归中(最后把之前存好的第一个数的值赋给中间的数)
        //左半部分的递归调用
            quicksort(left, m-1);
        //右半部分的递归调用
            quicksort(m+1,right);
         }

 运行结果:

生成随机数组......
16 16 46 30 30 13 45 25 61 95 
*************************************************
排序......
13 16 16 25 30 30 45 46 61 95 
Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/joob000/article/details/81169645