JAVA写的排序笔记

数据结构的东西忘了好多,要找新工作了,复习复习。

package com.test;

import java.util.Arrays;
import java.util.Date;

public class Sort{

	public static void main(String[] args) {
//		gerneraMethod("1", 2 , new Date());//做个泛型的案例给你看看就好
		Integer[] A = new Integer[] {null, 19, 8, -38, 49, 65, 97 , 76, 13, 27, 4 , 18, 57};
		Integer[] B = new Integer[] { 19, 8, -38, 49, 65, 97 , 76, 13, 27, 4 , 18, 57};
//		ShellSort(A);
//		InsertSort(A);
//		A[0] = null;
//		ShellSort(A);
//		BubbleSort(B);
//		TowWayBubbleSort(B);
//		int low=0, hight=B.length-1;
//		QuickSort(B, low, hight);
		SelectSort(B);
		PrintArray(B);
	}
	
	//直接插入排序 
	public static void InsertSort(Integer[] A) {
		int j;
		for(int i=2; i<A.length; i++) {
			if(A[i-1]>A[i]) {
				A[0] = A[i];
				for(j=i-1; A[0]<A[j]; --j) {
					//从后面开始比较,只要比存储位的值大,就往后挪,最终空出一个位置给存储位数据插入
					A[j+1] = A[j];
				}
				A[j+1] = A[0];
			}
		}//时间的效率为logn^2, 空间复杂度为O(1)
	}
	
	//折半插入排序 
	private static void midInsertSort(Integer[] A) {
		int i, j, mid, hight, low;
		for(i=2; i<A.length; i++ ) { 
			A[0] = A[i];
			low=1;//从第一个到
			hight=i-1;//标记的前一个
			while (low<=hight) {
				mid=(low+hight)/2;
				if(A[0]<A[mid]) {
					hight = mid-1;//既然比A[mid]大,就从左边接着找
				}else {
					low = mid+1;//比A[mid]小,就从右边找
				}
			}//最终是找到该插入的位置。
			for(j=i-1; j>=low; --j) {
				A[j+1]=A[j];//将数据往后移 
			}
			A[low] = A[0];//插入位置
		}
	}
	
	//希尔排序
	private static void ShellSort(Integer[] A) {
		int i, j, dk;
		for(dk=A.length/2; dk>=1; dk/=2 ) {
			for(i=dk+1; i<A.length; i++) {//每次仅选取增量排序的那段,
				if(A[i]<A[i-dk]) {
					A[0] = A[i];//将最后的这个值存放在A[0]
					for(j=i-dk; j>0 && A[0]<A[j]; j-=dk)
						A[j+dk] = A[j];//每个子结果集其实不是在同一次排序中完成的
					A[j+dk]=A[0];	
				}
			}
		}
	}
	
	//冒泡排序
	private static void BubbleSort(Integer[] A) {
		int i, j, len = A.length, temp;
		boolean flag=true;
		for(i=0; i<len&&flag; i++) {//flag是用来判断是否有序的标记,
			flag=false;
			for(j=len; j>i; j--) {
				if(A[j-1]>A[j]) {
					temp = A[j-1];
					A[j-1] = A[j];
					A[j] = temp;
					flag = true;//发生排序就是还未有序
				}
			}
		}
	}
	
	//双向冒泡排序,及第一次从前向后直到将最大的数置于后面,
	//第二次将最小的数置于最前方
	private static void TowWayBubbleSort(Integer[] A) {
		int i, j, low=0, high = A.length-1;
		boolean flag=true;
		while (low<high&&flag) {
			flag=false;
			for(i=low; i<high; i++) {//flag是用来判断是否有序的标记
				if(A[i+1]<A[i]) {//除了第一个和最后一个,每个元素都会比较两次
					swag(A, i+1, i);
					flag = true;
				}
			}
			high--;
			for(j=high; j>low; j--) {
				if(A[j-1]>A[j]) {
					swag(A, j-1, j);
					flag = true;
				}
			}
			low++;
		}
	}
	
	//快速排序
	private static void QuickSort(Integer[] A, Integer low, Integer hight) {
		
		if(low<hight) {
			int pivotpos = Partition(A, low, hight);
			QuickSort(A, low, pivotpos-1);
			QuickSort(A, pivotpos+1, hight);
		}
	}
	
	private static int Partition(Integer[] A, Integer low, Integer hight) {
			int pivot = A[low];//这里注意时拿子集合下标最低的那个 
			while (low<hight) { 
				while(low<hight&&A[hight]>=pivot) --hight;//符合条件不用换位置,继续左走
				A[low] = A[hight];
				while(low<hight&&A[low]<=pivot) ++low;//符合条件不用换位置,继续右走
				A[hight] = A[low];
			}
			A[low] = pivot;
		return low;
	}
	
	//简单选择排序
	private static void SelectSort(Integer[] A) {
		int i, j, len = A.length, min;
		for(i=0; i<len; i++) {
			min=i;
			for(j=i; j<len; j++) {
				if(A[j]<A[min]) min = j;
			}
			swag(A, i, min);
		}
	}
	

	//交换指定下标上的数据 
	private static void swag(Integer[] A, Integer a, Integer b) {
		int temp = A[a];
		A[a] = A[b];
		A[b] = temp;
	}
	
	//打印出来
	private static void PrintArray(Integer[] A) {
		Arrays.asList(A).forEach(item->{
			System.out.print(item==null?"":item+" ");
		});
	}
	
	public static<T> void gerneraMethod(T... elements) {
		for(T element : elements) {
			if(element instanceof Integer) {
				System.out.println("处理的。。。这里是整型");
			}else if (element instanceof String) {
				System.out.println("处理的。。。这里是字符串");
			}else if (element instanceof Double) {
				System.out.println("处理的。。。这里是双精度浮点");
			}else if (element instanceof Float) {
				System.out.println("处理的。。。这里是单精度浮点");
			}else if (element instanceof Long) {
				System.out.println("处理的。。。这里是单精度浮点");
			}else if (element instanceof Boolean) {
				System.out.println("处理的。。。这里是布尔值");
			}else if (element instanceof Date) {
				System.out.println("处理的。。。这里是时间");
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值