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] + "\t");
			}
			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] + "\t");
			}
			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] + "\t" + 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));
	}
}
posted @ 2021-02-15 05:20  Py-JS  阅读(45)  评论(0编辑  收藏  举报