欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有趣的数组

程序员文章站 2022-04-19 15:34:50
...

今天我学习了Java当中数组方面的知识,它C,C++里面的数组形式可是大有不同啊。接下来让我介绍一下这方面的知识以及自己学习之后的感受吧。
Java当中数组的声明与开辟:
数组类型 [] 数组名称 = new 数组类型[数组长度];(一维数组)
比如:int[] data = new data[10];
数据类型 对象数组[][] = new 数据类型[行个数][列个数];(二维数组)
比如:int data[][] =new data[8][7];
或者可以:
数组类型[] 数组名称 ={数组元素};
比如:int[] data ={1,2,2,3,4,5}; //其长度为6;
数据类型 对象数组[][] = {{…},{…},{…}};
如果说我们已经定义了一个长度为6的数组,但是我们又想塞进去7个元素,这个时候为了避免数组越界,我们可以重新开辟一个新的数组:data =new int[7];
在上面我们又提到了数组类型,那么数组有哪几种类型呢?我告诉你,不,老师说,数组有八种类型:int,double,char,byte,long,boolean,float,short.
然后呢,我们又对数组排序这方面进行了学习,感觉原理和C++当中的原理一样,正所谓万变不离其宗,是吧。咱们就一起来稍微谈谈大家所熟知的冒泡排序和快速排序吧。
冒泡法演示:
很简单,用到的很少,据了解,面试的时候问的比较多!

将序列中所有元素两两比较,将最大的放在最后面。

将剩余序列中所有元素两两比较,将最大的放在最后面。

重复第二步,直到只剩下一个数。
设置循环次数。

设置开始比较的位数,和结束的位数。

两两比较,将最小的放到前面去。

重复2、3步,直到循环次数完毕。

int[] a={10,9,4,6,2,8,3,7,1,5};
		String act = e.getActionCommand();
		if("冒泡排序法".equals(act))
		for(int i=0;i<a.length;i++)
			for(int j=i+1;j<a.length;j++)
			{
				if(a[i]>a[j])
			{
				int temp=a[i];
				a[i]=a[j];
				a[j]=temp;
				}......

快速法排序:
通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

快速排序的示例:

(a)一趟排序的过程:

(b)排序的全过程

把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。

public   int getMiddle(int[] a, int low,int high)
    {
		int start = low;
		int end = high;
        int temp = a[start]; //数组的第一个作为中轴
        while(start< end)
        {
        while(start < end && a[end] > temp)
        {
            end--;
        }
        a[start] = a[end];//比中轴小的记录移到低端
         while(start < end && a[start] < temp)
        {
            start++;
        }
        a[end] = a[start] ; //比中轴大的记录移到高端
        }
         a[start] = temp ; //中轴记录到尾
         return start;
         }
         public void QuickSort(int[] a,int low,int high)
	    {
	        if(low < high)
	        {
	       int middle = getMiddle(a,low,high); //将numbers数组进行一分为二
	       QuickSort(a, low, middle-1);   //对低字段表进行递归排序
	       QuickSort(a, middle+1, high); //对高字段表进行递归排序
	        }
	    
	    }

接下来我们可以自己设置一个画板把这两个排序过程用动态图像直观的表示出来,这是鄙人写的一个普通的演示代码:

import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;


public class Sort {

	public void showUI(){
		JFrame jfr = new JFrame();
		jfr.setSize(1000,800);
		jfr.setTitle("排序图像演示");
		jfr.setLocationRelativeTo(null);
		jfr.setDefaultCloseOperation(3);
		jfr.setLayout(new FlowLayout());
		DrawListener drawl = new DrawListener();
		JButton jbt = new JButton("冒泡排序法");
		jfr.add(jbt);
		jbt.addActionListener(drawl);
		JButton jbt1 = new JButton("快速排序法");
		jfr.add(jbt1);
		jbt1.addActionListener(drawl);
		jfr.setVisible(true);
		
		Graphics g =jfr.getGraphics();
		drawl.g=g;
	}
	public static void main(String[] agrs){
		Sort s =new Sort();
		s.showUI();
	}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class DrawListener implements ActionListener {
	
	Graphics g;
	public   int getMiddle(int[] a, int low,int high)
    {
		int start = low;
		int end = high;
        int temp = a[start]; //数组的第一个作为中轴
        while(start< end)
        {
        while(start < end && a[end] > temp)
        {
            end--;
        }
        a[start] = a[end];//比中轴小的记录移到低端
        g.setColor(Color.WHITE);
		g.fillRect(0,0,2000,1000);
		for(int k=0;k<a.length;k++)
		{
			
			Color c =new Color(0,a[k]*10,0);
			g.setColor(c);
			g.drawString(""+a[k],(k*40)+40, 150);
			
			g.fillRect(k*40+40,200,20,20*a[k]);
		}
		try {
			Thread.sleep(400);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        while(start < end && a[start] < temp)
        {
            start++;
        }
        a[end] = a[start] ; //比中轴大的记录移到高端
        g.setColor(Color.WHITE);
		g.fillRect(0,0,2000,1000);
		for(int k=0;k<a.length;k++)
		{
			
			Color c =new Color(0,a[k]*10,0);
			g.setColor(c);
			g.drawString(""+a[k],(k*40)+40, 150);
			
			g.fillRect(k*40+40,200,20,20*a[k]);
		}
		try {
			Thread.sleep(700);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        }
        a[start] = temp ; //中轴记录到尾
        g.setColor(Color.WHITE);
		g.fillRect(0,0,2000,1000);
		for(int k=0;k<a.length;k++)
		{
			
			Color c =new Color(0,a[k]*10,0);
			g.setColor(c);
			g.drawString(""+a[k],(k*40)+40, 150);
			
			g.fillRect(k*40+40,200,20,20*a[k]);
		}
		try {
			Thread.sleep(700);
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
        return start ; // 返回中轴的位置
    }
	 public void QuickSort(int[] a,int low,int high)
	    {
	        if(low < high)
	        {
	       int middle = getMiddle(a,low,high); //将numbers数组进行一分为二
	       QuickSort(a, low, middle-1);   //对低字段表进行递归排序
	       QuickSort(a, middle+1, high); //对高字段表进行递归排序
	        }
	    
	    }
	/*/public void FastSort(int[] a,int low,int high){
		int start = low;
		int end =high;
		int temp=a[low];
		while(start<end){
			while(start<end&&a[end]>temp){
				end--;
			}
			a[start]=a[end];
			while(start<end&&a[start]<temp){
				start++;
			}
			a[end]=a[start];
			a[start]=temp;
			if(start<end){
				FastSort(a,low,start-1);
				FastSort(a,start+1,high);
			}
		}
		
	}/*/
	public void actionPerformed(ActionEvent e){
		int[] a={10,9,4,6,2,8,3,7,1,5};
		String act = e.getActionCommand();
		if("冒泡排序法".equals(act))
		for(int i=0;i<a.length;i++)
			for(int j=i+1;j<a.length;j++)
			{
				if(a[i]>a[j])
			{
				int temp=a[i];
				a[i]=a[j];
				a[j]=temp;
				g.setColor(Color.WHITE);
				g.fillRect(0,0,2000,1000);
				for(int k=0;k<a.length;k++)
				{
					
					Color c =new Color(0,a[k]*10,0);
					g.setColor(c);
					g.drawString(""+a[k],(k*40)+40, 150);
					
					g.fillRect(k*40+40,200,20,20*a[k]);
				}
				try {
					Thread.sleep(400);
				} catch (InterruptedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
				
			}
		if("快速排序法".equals(act)){
			QuickSort(a, 0, 9);
			for(int i=0;i<10;i++)
				System.out.println(" "+a[i]);
		}

}
}