排序
选择排序
方法:当前元素与之后所有的元素进行比较,若后者小于前者则两者交换位置。
- 从数组第一个元素开始。
- 遍历整个数组,找到最小的元素。
- 将最小的元素与数组第一个元素交换。
- 从第二个元素开始重复上述步骤。
public class Test05_01{
public static void main(String[] args){
int[] arr={7,4,5,9,8,2,1};
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
}
}
冒泡排序
算法步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public class Test05_01{
public static void main(String[] args){
int[] arr={7,4,5,9,8,2,1};
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;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
}
}
插入排序
算法步骤
- 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
- 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
public class Test05_01{
public static void main(String[] args){
int[] arr={7,4,5,9,8,2,1};
int e;
int j;
for(int i=1;i<arr.length;i++){
e=arr[i];
for(j=i;j>0&&arr[j-1]>e;j--){
arr[j]=arr[j-1];
}
arr[j]=e;
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
计数排序
- 计数排序的核心思想是把一个无序序列 A 转换成另一个有序序列 B,从 B 中逐个“取出”所有元素,取出的元素即为有序序列
public class Test05_01{
public static void main(String[] args){
int[] arr={7,4,5,9,8,2,1};
int min=arr[0];
int max=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<min){
min=arr[i];
}
}
int[] nums=new int[max-min+1];
int offset=min;
for(int i=0;i<arr.length;i++){
nums[arr[i]-offset]++;
}
int index=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
for(int j=0;j<nums[i];j++){
arr[index++]=i+offset;
}
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
*/
}
}
练习
思路1:数组长度不固定 需要读取一个数据 数组扩容 填入数据数据填入之后进行排序 然后遍历数组依次判断数据的个数连续相等。2 2 2 2 3 3 4 4 4 4 5 5 6 6 6 6 7 7
思路2:借助计数排序的思想 将数组固定起来。
import java.util.*;
class Demo05_01{
public static void main(String[] args){
//1.获取用户输入的数据 动态的扩容数组填充数据
Scanner scanner = new Scanner(System.in);
int[] arr=new int[0];
System.out.print("Enter numbers:");
while(true){
int num=scanner.nextInt();
if(num==0){
break;
}
//验证用户输入数据的正确性
if(num<1||num>100){
System.out.println("有非法数据!");
return;
}
arr=copyOf(arr,arr.length+1);
arr[arr.length-1]=num;
}
//2.按照输出结果 将数据中的数据进行排序
insertSort(arr);
//3.输出连续相等的数字
show(arr);
}
public static int[] copyOf(int[] arr,int newLen){
int[] newArr=new int[newLen];
for(int i=0;i<arr.length;i++){
newArr[i]=arr[i];
}
return newArr;
}
public static void insertSort(int[] arr){
for(int i=1;i<arr.length;i++){
int e=arr[i];
int j;
for(j=i;j>0&&arr[j-1]>e;j--){
arr[j]=arr[j-1];
}
arr[j]=e;
}
}
/*
Arrays Math都是属于工具类
Arrays 特殊的是数组的工具类
toString(arr) 就是将数据的每个元素进行拼接 并返回拼接后的字符串数据
"[1,2,3,4]"
*/
public static void show(int[] arr){
System.out.println(Arrays.toString(arr));
//此时就将问题转成了如何判断连续相等的数据分别出现多少次
//[1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6]
for(int i=0;i<arr.length;){
int count=1;
for(int j=i+1;j<arr.length;j++){
if(arr[j]==arr[i]){
count++;
}else{
break;
}
}
System.out.println(arr[i]+" occurs "+count+(count>1?" times":" time"));
i+=count;
}
}
}
import java.util.Scanner;
public class Home05_02 {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int[] f = new int[10];
System.out.print("Enter ten numbers: ");
int count=0;
for(int i=1;i<10;i++){
int number = input.nextInt();
int j;
for(j=0;j<count;j++){
if(number==f[j]){
break;
}
}
if(j==count){
f[count]=number;
count++;
}
}
System.out.print("The distinct numbers are: ");
for(int i=0;i<count;i++){
System.out.print(f[i]+" ");
}
}
}
import java.util.*;
class Demo05_03{
public static void main(String[] args){
//1.获取用户的输入 只不过第一个输入的数据时数据的个数(数组的长度)
Scanner scanner=new Scanner(System.in);
System.out.print("Enter a list:");
int len=scanner.nextInt();//获取的第一个数值就是数组的长度
int[] arr=new int[len];
for(int i=0;i<arr.length;i++){
arr[i]=scanner.nextInt();
}
//2.对数组进行有序的判断
if(isSorted(arr)){
System.out.println("The list is already sorted.");
}else{
System.out.println("The list is not sorted.");
}
}
public static boolean isSorted(int[] list){
//如果不是升序排列 那么势必会出现有一组数据 左大右小的情况
for(int i=1;i<list.length;i++){
if(list[i-1]>list[i]){
return false;
}
}
return true;
}
}
class Demo05_05{
public static void main(String[] args){
int[] list1={1,2,3,4,5,6,7};
int[] list2={1,2,3,4,5,7,6};
System.out.println(equals(list1,list2));
}
public static boolean equals(int[] list1,int[] list2){
//判断两个数组是否完全相同
//1.先判断长度
if(list1.length!=list2.length){
return false;
}
//2.再依次判断元素大小
for(int i=0;i<list1.length;i++){
if(list1[i]!=list2[i]){
return false;
}
}
return true;
}
}
class Demo05_06{
public static void main(String[] args){
int[] arr={1,1,1,1,2,2,2,2,2,3,3,3,3,3,4};
for(int i=0;i<arr.length;){
int count=1;
for(int j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
count++;
}else{
break;
}
}
if(count>=4){
System.out.println(arr[i]);
return;
}
i+=count;
}
System.out.println("没有!");
}
}
import java.util.*;
class Demo05_07{
public static void main(String[] args){
int[] list1={1,3,5,7,9};
int[] list2={2,4,6,8,10};
System.out.println(Arrays.toString(merge(list1,list2)));
}
/*
有序数组的合并
最主要的问题在于 数组之间有长有短
*/
public static int[] merge(int[] list1,int[] list2){
if(list1==null&&list2==null){
return null;
}
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
//只有两个都不是null的情况再考虑具体操作
int[] list3=new int[list1.length+list2.length];
int p1=0;
int p2=0;
int p3=0;
while(true){
if(p1==list1.length&&p2==list2.length){
break;
}
if(p1<list1.length&&p2==list2.length){
list3[p3++]=list1[p1++];
}else if(p1==list1.length&&p2<list2.length){
list3[p3++]=list2[p2++];
}else{
if(list1[p1]<=list2[p2]){
list3[p3++]=list1[p1++];
}else{
list3[p3++]=list2[p2++];
}
}
}
return list3;
}
}
import java.util.Scanner;
public class Home05_09{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("Enter number:");
double[][] matrix=new double[3][4];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
matrix[i][j]=input.nextDouble();
}
}
//打印每列的和
for(int col=0;col<matrix[0].length;col++){
System.out.println(sumColumn(matrix,col));
}
}
public static double sumColumn(double[][] m,int col){
double sum=0;
for(int row=0;row<m.length;row++){
sum=sum+m[row][col];
}
return sum;
}
}
public class Home05_10{
public static void main(String[] args) {
int m[] []={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
/*
int sum=0;
for(int i=0;i<m.length;i++){
for(int j=0;j<m[i].length;j++){
if(i==j){
sum=sum+m[i][j];
}
}
}
*/
/*主对角线
int sum=0;
for(int i=0;i<m.length;i++){
sum=sum+m[i][i];
}
System.out.println(sum);
*/
//副对角线
int sum=0;
for(int i=0;i<m.length;i++){
sum=sum+m[i][m.length-1-i];
}
System.out.println(sum);
}
}
public class Home05_11{
public static void main(String[] args) {
int[][] a={
{1,3,2},
{1,0,0},
{1,2,2}
};
int[][] b={
{0,0,2},
{7,5,0},
{2,1,1}
};
double [] [] c=new double[a.length][b[0].length];
for(int i=0;i<c.length;i++){
for(int j=0;j<c[i].length;j++){
double sum=0;
for(int k=0;k<b.length;k++){
sum+=a[i][k]*b[k][j];
}
c[i][j]=sum;
System.out.print(c[i][j]+" ");
}
System.out.println();
}
}
}
五子棋
import java.util.*;
public class Home05_15{
public static String[][]board;
public static String BLACK_CHESS="O"; //黑棋
public static String WHITE_CHESS="X"; //白棋
public static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) {
intiboard();
printboard();
startgame();
gameover();
}
public static boolean gameover(){
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
if(!board[i][j].equals("+")){
//向右
if(j<=board.length - 5){
boolean flag = true;
for(int c = 1;c<=4;c++){
if(board[i][j]!=board[i][j + c]){
flag = false;
break;
}
}
if(flag){
return true;
}
}
//向下
if(i<=board.length - 5){
boolean flag = true;
for(int r = 1;r<=4;r++){
if(board[i][j]!=board[i + r][j]){
flag = false;
break;
}
}
if(flag){
return true;
}
}
//向右下
if(i<=board.length - 5 && j<=board.length - 5){
boolean flag = true;
for(int k = 1;k<=4;k++){
if(board[i][j]!=board[i + k][j + k]){
flag = false;
break;
}
}
if(flag){
return true;
}
}
//向右上
if(i>=4 && j<=board.length - 5){
boolean flag = true;
for(int k = 1;k<=4;k++){
if(board[i][j]!=board[i - k][j + k]){
flag = false;
break;
}
}
if(flag){
return true;
}
}
}
}
}
return false;
}
public static void startgame(){
int player=0;
while(true){
if(player%2==0){
System.out.print(">>>请黑方下棋:");
if(!putchess(BLACK_CHESS)){
continue;
}
}
else{
System.out.print(">>>请白方下棋:");
if(!putchess(WHITE_CHESS)){
continue;
}
}
if(gameover()){
break;
}
player++;
}
System.out.println("游戏结束!");
}
public static boolean putchess(String chess){
int x=scanner.nextInt()-1;
int y=scanner.nextInt()-1;
if(!board[x][y].equals("+")){
System.out.println(">>>此处已有棋子,请重新下棋");
return false;
}
board[x][y]=chess;
printboard();
return true;
}
public static void printboard(){
System.out.print(" ");
for(int i=0;i<=14;i++){
System.out.printf("%2d",i+1);
}
System.out.println();
for(int i=0;i<board.length;i++){
System.out.printf("%2d ",i+1);
for(int j=0;j<board[i].length;j++){
System.out.print(board[i][j]+" ");
}
System.out.println();
}
}
public static void intiboard(){
board=new String[15][15];
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
board[i][j]="+";
}
}
}
}