JAVA实现五种排序算法

用JAVA实现冒泡排序、选择排序、插入排序、快速排序和归并排序。封装在sort类中。

class Sort{
	/* 辅助函数 */
	//Java没有引用,利用数组来完成值的交换
	void swap(int a[], int i, int j) {
		int c = a[i];
		a[i] = a[j];
		a[j] = c;
	} 
	//输出数组
	void print(int a[]) {
		for(int i: a) {
			System.out.print(i + " ");
		}
		System.out.print("\n");
	}
	//----------------华丽分割线--------------------//
	/* 5种排序算法的实现 */
	//冒泡排序
	public void Bubble_Sort(int a[], int n) {
		for(int i = n - 2; i >= 0; i--) {
			for(int j = 0; j <= i; j++) {
				if(a[j] > a[j + 1])swap(a, j, j + 1);
			}
		}
	}
	//插入排序
	public void Insert_Sort(int a[], int n) {
		for(int i = 1; i < n; i++) {
			if(a[i] < a[i - 1]) {
				int temp = a[i], j = i - 1;
				while(j >= 0 && a[j] > temp) {
					a[j + 1] = a[j];
					j--;
				}
				a[j + 1] = temp;
			}
		}
	}
	//选择排序
	public void Selection_Sort(int a[], int n) {
		for(int i = 0; i < n; i++) {
			int min = a[i], min_index = i;
			for(int j = i + 1; j < n; j++) {
				if(a[j] < min) {
					min = a[j];
					min_index = j;
				}
			}
			swap(a, i, min_index);
		}
	}
	//快速排序
	//参考 http://www.cnblogs.com/CBDoctor/p/4077574.html
	public void Quick_Sort(int a[], int n) {
		recursive(a, 0, n - 1);
	}
	void recursive(int a[], int left, int right) {
		if(left > right)return ;
		
		int x = a[left];
		int i = left, j = right;
		while(i != j) {
			while(i < j && a[j] >= x)j--;
			while(i < j && a[i] <= x)i++;
			swap(a, i, j);
		}
		
		swap(a, left, i);
		recursive(a, left, i - 1);
		recursive(a, i + 1, right);
	}
	//归并排序
	//参考 http://blog.youkuaiyun.com/morewindows/article/details/6678165
	void Merge_Sort(int a[], int n) {
		mergeSort(a, 0, n - 1);
	}
	void mergeSort(int a[], int left, int right) {
		if(left < right) {
			int mid = (left + right) / 2;
			//先递归的给左右两个子数组排序
			mergeSort(a, left, mid);
			mergeSort(a, mid + 1, right);
			//合并两个已经有序的数组
			mergeArray(a, left, right, mid);
		}
	}
	void mergeArray(int a[], int left, int right, int mid) {
		int copy[] = new int[right - left + 1];
		int i = left, j = mid + 1;
		int limit_1 = mid + 1, limit_2 = right + 1;//两个数组的界限
		int index = 0;
		
		while(i < limit_1 && j < limit_2) {
			if(a[i] < a[j]) copy[index++] = a[i++];
			else copy[index++] = a[j++];
		}
		while(i < limit_1) copy[index++] = a[i++];
		while(j < limit_2) copy[index++] = a[j++];
		//把值赋给原来的数组
		for(int k = 0; k < copy.length; k++)
			a[left + k] = copy[k];
	}
}

public class HelloWorld {
	public static void main(String[] args) {
		int a[] = {1, 1, 2, 2, 0, 6, 3, 2, 6};
		Sort sort = new Sort();
		sort.Merge_Sort(a, a.length);
		sort.print(a);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值