zoukankan      html  css  js  c++  java
  • 007数组常见排序算法

    数组中的常见算法

    1.数组元素的赋值(杨辉三角、回形数等)

    练习1:打印回形数

    这个题简直不要太恶心

    方式一

    package com.atguigu.exer;
    
    import java.util.Scanner;
    
    /*
     * 回形数格式方阵的实现
    从键盘输入一个整数(1~20) 
    则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
    例如: 输入数字2,则程序输出: 
    1 2 
    4 3 
    输入数字3,则程序输出: 
    1 2 3 
    8 9 4 
    7 6 5 
    
    1  2  3  4
    12 13 14 5
    11 16 15 6
    10 9  8  7
    
     */
    public class HuiXingTest {
    	public static void main(String[] args){
    		//1.获得用户输入的值,创建一个二维数组
    		Scanner scanner = new Scanner(System.in);
    		int len = scanner.nextInt();
    		int[][] arr = new int[len][len];
    		
    		//2.定义需要做判断的值
    		int k = 1;  // 右 == 1,下 == 2,左 == 3; 上  == 4
    		int i = 0;  //行
    		int j = 0;  //列
    		int sum = len*len;  //总数
    		//3.
    		for(int m = 1; m <= sum; m++){
    			if(k==1){
    				if(j<len&&arr[i][j]==0){
    					arr[i][j++] = m;
    				}else{
    					k = 2;
    					i++;
    					j--;
    					m--;
    					continue;
    				}
    			}else if(k==2){
    				if(i<len&&arr[i][j]==0){
    					arr[i++][j] = m;
    				}else{
    					k = 3;
    					j--;
    					i--;
    					m--;
    					continue;
    				}
    			}else if(k==3){
    				if(j>=0&&arr[i][j]==0){
    					arr[i][j--] = m;
    				}else{
    					k = 4;
    					i--;
    					j++;
    					m--;
    					continue;
    				}
    			}else if(k==4){
    				if(i>=1&&arr[i][j]==0){
    					arr[i--][j] = m;
    				}else{
    					k = 1;
    					j++;
    					i++;
    					m--;
    					continue;
    				}
    			}
    		}
    		
    		
    		
    		//3.输出测试
    		for(int v = 0; v < arr.length; v++){
    			for(int x = 0; x < arr[i].length; x++){
    				System.out.print(arr[v][x] + "	");
    			}
    			System.out.println();
    		}
    	}
    }
    

    方式二

    package com.atguigu.exer;
    
    public class HuiXingTest01 {
    	public static void main(String[] args){
    		//1.定义初始值
    		int n = 6;
    		int[][] arr = new int[n][n];
    		int m = 0; //要存入到数组中的数字
    		int maxX = n - 1; //最大X轴
    		int maxY = n - 1; //最大Y轴
    		int minX = 0; //最小X轴
    		int minY = 0; //最小Y轴
    		//2.进行数组填充
    		while(minX<=maxX){
    			for(int x = minX; x <= maxX; x++){
    				arr[minY][x] = ++m;
    			}
    			minY++;
    			for(int y = minY; y <= maxY; y++){
    				arr[y][maxX] = ++m;
    			}
    			maxX--;
    			for(int x = maxX; x >= minX; x--){
    				arr[maxY][x] = ++m;
    			}
    			maxY--;
    			for(int y = maxY; y >= minY; y--){
    				arr[y][minX] = ++m;
    			}
    			minX++;
    		}
    		//3.输出测试
    		for(int v = 0; v < arr.length; v++){
    			for(int l = 0; l < arr[v].length; l++){
    				System.out.print(arr[v][l] + "	");
    			}
    			System.out.println();
    		}
    	}
    }
    

    2.求数值型数组中元素的最大值、最小值、平均数、总和等

    image-20210117115553514

    练习1:打印一维数组中的最大值、最小值、总和、平均值

    package com.atguigu.exer;
    
    /*
     * 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
     * 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来
     */
    public class ArrayTest01 {
    	public static void main(String[] args) {
    		int[] arr = new int[] { 12, 64, 23, 45, 67, 86, 54, 23, 65, 90 };
    		//1.选出最大值
    		int max = arr[0];
    		for(int i = 1; i < arr.length; i++){
    			if(max < arr[i]){
    				max = arr[i];
    			}
    		}
    		System.out.println("最大值:" + max);
    		//2.选出最小值
    		int min = arr[0];
    		for(int i = 1; i < arr.length; i++){
    			if(min > arr[i]){
    				min = arr[i];
    			}
    		}
    		System.out.println("最小值:" + min);
    		//3.总和
    		int sum = 0;
    		for(int i = 0; i < arr.length; i++){
    			sum += arr[i];
    		}
    		System.out.println("总和:" + sum);
    		//4.平均值
    		System.out.println("平均值" + (sum/arr.length));
    	}
    }
    

    3.数组的复制、反转、查找(线性查找、二分法查找)

    练习1:复制、反转

    image-20210117121227275

    image-20210117123817376

    image-20210117123928860

    package com.atguigu.exer;
    
    import java.util.Arrays;
    
    /*
     * 反转数组
     */
    public class ArrayTest02 {
    	public static void main(String[] args){
    		int[] arr = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };
    		for(int i = 0,j = arr.length - 1; i < arr.length/2; i++,j--){
    			int temp = arr[i];
    			arr[i] = arr[j];
    			arr[j] = temp;
    		}
    		System.out.println(Arrays.toString(arr));
    	}
    }
    

    练习2:线性查找和二分查找

    package com.atguigu.exer;
    
    public class ArrayTest03 {
    	public static void main(String[] args) {
    		int[] arr = new int[] { -34, -23, -10, -4, 0, 3, 12, 23, 54, 123 };
    		//1.线性查找
    		int dest = 233;
    		boolean isFlag = true;
    		for(int i = 0; i < arr.length; i++){
    			if(arr[i]==dest){
    				System.out.println("目标在:" + i);
    				isFlag = false;
    				break;
    			}
    		}
    		if(isFlag){
    			System.out.println("没有找到");
    		}
    		
    		System.out.println("==========================");
    		
    		//2.二分查找:要求数组必须是有序的
    		int dest1 = 23;
    		int start = 0;
    		int end = arr.length-1;
    		boolean isFlags = true;
    		while(start < end){
    			int center = (end + start)/2;
    			if(arr[center] == dest1){
    				System.out.println("找到了:" + center);
    				isFlags = false;
    				break;
    			}else if(arr[center] > dest1){
    				end = center - 1;
    			}else{
    				start = center + 1;
    			}
    			
    		}
    		if(isFlags){
    			System.out.println("没有找到");
    		}
    	}
    }
    

    4.数组元素的排序算法

    image-20210117140637394

    image-20210117140701478

    image-20210117140803498

    image-20210117140926411

    image-20210117140942343

    image-20210117141216786

    image-20210117141254776

    image-20210117141351051

    练习1:冒泡排序

    package com.atguigu.exer;
    
    import java.util.Arrays;
    
    /*
     * 冒泡排序
     */
    public class ArrayTest04 {
    	public static void main(String[] args){
    		//1.创建数组
    		int[] bubbling = new int[]{4,10,-1,-23,-4,23,21,12,54,64,-34,123,53,63};
    		//2.冒泡排序
    		for(int i = 0; i < bubbling.length - 1; i++){
    			for(int j = 0; j < bubbling.length - 1 - i; j++){
    				if(bubbling[j] > bubbling[j+1]){
    					int temp = bubbling[j];
    					bubbling[j] = bubbling[j+1];
    					bubbling[j+1] = temp;
    				}
    			}
    		}
    		//3.输出测试
    		System.out.println(Arrays.toString(bubbling));
    	}
    }
    

    练习2:快速排序

    
    

    Arrays工具类

    image-20210117210401794

    image-20210117210510158

    练习1:找出最大值与最小值并调换位置

    package com.atguigu.java;
    
    import java.util.Arrays;
    
    /*
     * 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。 
     */
    public class ArrayDemo05 {
    	public static void main(String[] args) {
    		int[] arr = new int[] { 134, 2465, 13, 34, -1, 343, -23, 9, 0, 43 };
            int min = 0;
            int max = 0;
            //选出最大值与最小值
            for(int i = 1; i < arr.length; i++){
                if(arr[i] < arr[min]){
                    min = i;
                }
                if(arr[i] > arr[max]){
                    max = i;
                }
            }
            //2.调整位置
            int temp1 = arr[max];
            arr[max] = arr[0];
            arr[0] = temp1;
    
            int temp2 = arr[min];
            arr[min] = arr[arr.length-1];
            arr[arr.length-1] = temp2;
            //3.测试
            System.out.println(arr[0] + "	" + arr[arr.length-1]);
            System.out.println(Arrays.toString(arr));
    	}
    }
    

    练习2:打印斐波那契数列

    package com.atguigu.java;
    
    import java.util.Arrays;
    
    /*
     * 用数组求出斐波那契数列的前20项值
     */
    public class ArrayDemo06 {
    	public static void main(String[] args){
    		int[] arr = new int[20];
    		arr[0] = 1;
    		arr[1] = 1;
    		int index = 2;
    		//1.循环赋值
    		for(int i = 0; i < arr.length - 2; i++){
    			int j = i + 1;
    			arr[index] = arr[i] + arr[j];
    			index++;
    		}
    		//2.打印测试
    		System.out.println(Arrays.toString(arr));
    	}
    }
    
  • 相关阅读:
    day_13
    day_12
    day_11
    day_10
    day_09
    day_08
    day_07
    day_06
    cmder 基本配置和使用
    php自动加载
  • 原文地址:https://www.cnblogs.com/Notesdata/p/14403173.html
Copyright © 2011-2022 走看看