数据结构排序算法

冒泡排序

public void sort1(int arr[]){
		//初始状态
		System.out.println("冒泡排序初始状态------------");
		for(int i=0;i<(arr.length);i++){
			System.out.print(arr[i]+" ");			
		}
		System.out.println();
		int temp;
		for(int i=0;i<(arr.length-1);i++){
			for(int j=(arr.length-1);j>i;j--){
				if(arr[j]<arr[j-1]){
					temp=arr[j];
					arr[j]=arr[j-1];
					arr[j-1]=temp;
				}
			}
			System.out.println("第"+i+"趟---------");
			for(int k=0;k<(arr.length);k++){
				System.out.print(arr[k]+" ");			
			}
			System.out.println();
		}
		
	}

从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了
注意:冒泡排序是从后往前两两比较,小的交换到前面,第一次第一个数排号,第二次第二个,依次类推
42 20 17 13 28 14 23 15
冒泡排序初始状态------------
42 20 17 13 28 14 23 15
第0趟---------
13 42 20 17 14 28 15 23
第1趟---------
13 14 42 20 17 15 28 23
第2趟---------
13 14 15 42 20 17 23 28
第3趟---------
13 14 15 17 42 20 23 28
第4趟---------
13 14 15 17 20 42 23 28
第5趟---------
13 14 15 17 20 23 42 28
第6趟---------
13 14 15 17 20 23 28 42

选择排序

public void sort2(int arr[]){
		//初始状态
		System.out.println("选择排序初始状态------------");
		for(int i=0;i<(arr.length);i++){
			System.out.print(arr[i]+" ");			
		}
		System.out.println();
		int temp;
		for(int i=0;i<(arr.length-1);i++){
			int a=i;
			for(int j=i+1;j<arr.length;j++){
				if(arr[a]>arr[j]){
					a=j;
				}
			}
			if(i!=a){
				temp=arr[i];
				arr[i]=arr[a];
				arr[a]=temp;
			}
			System.out.println("第"+i+"趟-------");
			for(int k=0;k<(arr.length);k++){
				System.out.print(arr[k]+" ");			
			}
			System.out.println();
		}
		
	}

选择排序初始状态------------
13 14 15 17 20 23 28 42
第0趟-------
13 14 15 17 20 23 28 42
第1趟-------
13 14 15 17 20 23 28 42
第2趟-------
13 14 15 17 20 23 28 42
第3趟-------
13 14 15 17 20 23 28 42
第4趟-------
13 14 15 17 20 23 28 42
第5趟-------
13 14 15 17 20 23 28 42
第6趟-------
13 14 15 17 20 23 28 42

插入排序

public void sort3(int arr[]){
		//初始状态
		System.out.println("插入排序初始状态------------");
		for(int i=0;i<(arr.length);i++){
			System.out.print(arr[i]+" ");			
		}
		System.out.println();
		int temp;
		for(int i=0;i<(arr.length-1);i++){
			for(int j=i+1;j>0;j++){
				if(arr[j]>arr[j-1]){
					break;
				}else{
					temp=arr[j];
					arr[j]=arr[j-1];
					arr[j-1]=temp;
				}
			}
			System.out.println("第"+i+"趟----------");
			for(int k=0;k<(arr.length);k++){
				System.out.print(arr[k]+" ");			
			}
			System.out.println();
		}
		
	}

在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序
插入排序初始状态------------
13 14 15 17 20 23 28 42
第0趟----------
13 14 15 17 20 23 28 42
第1趟----------
13 14 15 17 20 23 28 42
第2趟----------
13 14 15 17 20 23 28 42
第3趟----------
13 14 15 17 20 23 28 42
第4趟----------
13 14 15 17 20 23 28 42
第5趟----------
13 14 15 17 20 23 28 42
第6趟----------
13 14 15 17 20 23 28 42

希尔排序

在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序
在这里插入图片描述

public void sort4(int arr[]){
		//初始状态
		System.out.println("希尔排序初始状态------------");
		for(int i=0;i<(arr.length);i++){
			System.out.print(arr[i]+" ");			
		}
		System.out.println();
		int slice=arr.length;
		int d=0;
		while(true){
			slice=slice/2;
			int temp;
			for(int i=0;i<slice;i++){
				for(int j=i+slice;j<arr.length;j+=slice){
					for(int t=j;t>0;t-=slice){
						if(arr[t]>arr[t-slice]){
							break;
						}else{
							temp=arr[t];
							arr[t]=arr[t-slice];
							arr[t-slice]=temp;
						}
					}
				}
				
			}
			System.out.println("第"+d+"趟-------");
			for(int k=0;k<(arr.length);k++){
				System.out.print(arr[k]+" ");			
			}
			System.out.println();
			d++;
			if(slice<=1){
				break;
			}
		}
	}

希尔排序初始状态------------
13 14 15 17 20 23 28 42
第0趟-------
13 14 15 17 20 23 28 42
第1趟-------
13 14 15 17 20 23 28 42
第2趟-------
13 14 15 17 20 23 28 42

快速排序

//挖坑填数
	public void sort5(int []arr,int l,int r){
		if(l>=r) return;
		int i=l,j=r;int key=arr[l];//选择第一个数作为关键字
		while(i<j){
			while((i<j)&&(arr[j]>=key)){
				j--;
			}
			if(i<j){
				arr[i]=arr[j];
				i++;
			}
			while(i<j&&arr[i]<key){//如果这里也选择等于的情况会出现什么
				i++;
			}
			if(i<j){
				arr[j]=arr[i];
				j--;
			}
		}
		arr[i]=key;
		System.out.println("排序结果------");
		for(int k=0;k<arr.length;k++){
			System.out.print(arr[k] );
		}
		System.out.println();
		sort5(arr,l,i-1);
		sort5(arr,i+1,r);
	}

快速排序实际就是一个挖坑填数
排序结果------
1314151720232842
排序结果------
1314151720232842
排序结果------
1314151720232842
排序结果------
1314151720232842
排序结果------
1314151720232842
排序结果------
1314151720232842
排序结果------
1314151720232842

归并排序

//利用一个新数组,将数组两两合并到新数组
	public void merge(int arr[],int l,int middle,int r,int te[]){
		int i=l;
		int j=middle;
		int k=middle+1;
		int t=r;
		int f=0;
		while(i<=j&&k<=t){
			if(arr[i]<arr[k]){
				te[f++]=arr[i];
				i++;
			}
			else{
				te[f++]=arr[k];
				k++;
			}
		}
		if(i<=j){
			te[f++]=arr[i];
			i++;
		}
		if(k<=t){
			te[f++]=arr[k];
			k++;
		}
		int g=0;
		for(int ff=l;ff<=r;ff++){
			arr[ff]=te[g++];
		}
	}
	public void sort6(int arr[],int l,int r,int te[]){
		if(r<l){
			sort6(arr,l,l+(l+r)/2,te);//左半部分排好序
			sort6(arr,l+(l+r)/2+1,r,te);//右半部分
			merge(arr,l,l+(l+r)/2,r,te);
			System.out.println("归并排序排序结果");
			for(int i=0;i<arr.length;i++){
				System.out.print(arr[i]+" ");
			}
			System.out.println();
		}
		
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值