基础排序算法

基础排序算法 Java 代码实现:

package main;

public class Sort {
	
	static void swap(int[] values, int firstIndex, int secondIndex) {
		int tmp = values[firstIndex];
		values[firstIndex] = values[secondIndex];
		values[secondIndex] = tmp;
	}

	/**
	 * 冒泡排序
	 * @param values
	 */
	static void sort1(int[] values) {
		for(int i = 0; i < values.length-1; i++) {
			for(int j = 0;j < values.length - i - 1; j++) {
				if (values[j]>values[j+1]) {
					int tmp = values[j];
					values[j] = values[j+1];
					values[j+1] = tmp;
				}
			}
		}
	}
	
	static void sort1_1(int[] values) {
		for(int i = values.length-1;i>0;i--) {
			for(int j = 0;j<i;j++) {
				if (values[j]>values[j+1]) {
					int tmp = values[j];
					values[j] = values[j+1];
					values[j+1] = tmp;
				}
			}
		}
	}

	/**
	 * 直接插入排序
	 * @param values
	 */
	static void sort2(int[] values) {
		for(int i = 1; i < values.length; i++) {
			for(int j = 0;j < i; j++) {
				if (values[j]>values[i]) {
					int tmp = values[i];
					for (int k = i; k > j; k--) {
						values[k] = values[k-1];
					}
					values[j] = tmp;
					break;
				}
			}
		}
	}
	
	static void sort2_1(int[] values) {
		for(int i = 1; i < values.length; i++) {
			int index = -1;
			for(int j = 0;j < i; j++) {
				if (values[j]>values[i]) {
					index = j;
					break;
				}
			}
			if (index == -1) continue;
			int tmp = values[i];
			for (int j = i; j > index; j--) {
				values[j] = values[j-1];
			}
			values[index] = tmp;
		}
	}

	/**
	 * 直接选择排序
	 * @param values
	 */
	static void sort3(int[] values) {
		for(int i = 0; i < values.length-1; i++) {
			int index = i;
			for(int j = i+1;j < values.length; j++) {
				if (values[j]<values[index]) {
					index = j;
				}
			}
			if (index != i) {
				int tmp = values[i];
				values[i] = values[index];
				values[index] = tmp;
			}
		}
	}


	/**
	 *希尔排序,是对直接插入排序的改进,先根据增量分组,对每个组进行直接插入排序,
	 *针对每个增量重复该排序,直至分量为1,进行最后一次排序。
	 * @param values
	 */
	static void sort4(int[] values) {

		int incrementValues[] = {4,2,1};

		sort4_1(values, incrementValues);
	}

	static void sort4_1(int[] values, int[] incrementValues) {
		for (int increment : incrementValues) {   
			for (int group = 0; group < increment; group++) {
				int startIndex = group;
				for(int i = group+increment; i < values.length; i+=increment) {
					int index = -1;
					for(int j = startIndex;j < i; j+=increment) {
						if (values[j]>values[i]) {
							index = j;
							break;
						}
					}
					if (index == -1) continue;
					int tmp = values[i];
					for (int j = i; j > index; j-=increment) {
						values[j] = values[j-increment];
					}
					values[index] = tmp;
				}
			}
		}
	}

	/**
	 * 快速排序,是对冒泡排序的改进,
	 * 设置一个枢轴记录,从待排序列的最后一个记录开始,将记录同枢轴记录比较,发现逆序后,将两者交换,
	 * 然后从待排序列的第一个记录开始,同枢轴记录比较,发现逆序后,将两者交换,重复这两个步骤直到遍历完整个序列为止。
	 * 然后对枢轴记录两边的两个序列做快速排序,如此重复,直到整个序列有序。
	 */

	static void sort5(int[] values) {

		sort5_1(values, 0, values.length - 1);
	}
	
	static void sort5_1(int[] values, int start, int end) {

		int centerIndex = start;
		int centerValue = values[centerIndex];
		
		int i = start;
		int j = end;
		
		while(i < j) {
			while(i < j && values[j] >= centerValue) {
				j--;
			}
			if (i < j) {
				swap(values,centerIndex,j);
				centerIndex = j;
			}
			while (i < j && values[i] <= centerValue) {
				i++;
			}
			if (i < j) {
				swap(values, centerIndex, i);
				centerIndex = i;
			}
		}
		
//		对左侧序列进行快排序
		if (start + 1 < centerIndex) {
			sort5_1(values, start, centerIndex - 1);
		}
//		对右侧序列进行快排序
		if (end - 1 > centerIndex) {
			sort5_1(values, centerIndex + 1, end);
		}
	}

	/**
	 * 堆排序,堆是指在一个序列中,第 i 个记录不大/小于第 2*i 个和第 2*i+1 个记录,那么这个序列称为堆。
	 * 堆排序,则是将待排序列看作一个完全二叉树,然后根据堆的定义,将待排序列构建为一个小根堆或大根堆,
	 * 之后,取走堆顶记录作为输出,然后调整堆为一个新堆,再取走堆顶记录,如此反复,得到最终的有序序列。
	 */
	static void sort6(int[] values) {
		for (int i = 0; i < values.length; i++) {
			sort6_1(values, i);
		}
	}
	
	static void sort6_1(int[] values, int start) {
		int base = start;
//		待排序列作为一个完全二叉树的层数
		double value = Math.log(values.length - start)/Math.log(2);
		int level = (int)(value);
		
//		调整为小根堆
		for (int i = level; i > 0; i--) {
			int levelStartIndex = (int) Math.pow(2, i) - 1;
			int levelEndIndex = (int) Math.pow(2, i + 1) - 1;
			
			for (int j = levelStartIndex; j < levelEndIndex && j + base < values.length; j = j + 2) {
				int leftIndex = j + base;
				int rightIndex = leftIndex + 1;
				int parentIndex = j/2 + base;
				
				int minIndex = parentIndex;
				if (values[minIndex] > values[leftIndex]) {
					minIndex = leftIndex;
				}
				if (rightIndex < values.length && values[minIndex] > values[rightIndex]) {
					minIndex = rightIndex;
				}
				if (minIndex != parentIndex) {
					swap(values, minIndex, parentIndex);
				}
			}
		}
	}
	
	public static void main(String[] args) {
		int[] values;

		values = getValues();
		Sort.sort1(values);
		printValues(values);
		
		values = getValues();
		Sort.sort1_1(values);
		printValues(values);
		
		values = getValues();
		Sort.sort2(values);
		printValues(values);
		
		values = getValues();
		Sort.sort2_1(values);
		printValues(values);

		values = getValues();
		Sort.sort3(values);
		printValues(values);
		
		values = getValues();
		Sort.sort4(values);
		printValues(values);
		
		values = getValues();
		Sort.sort5(values);
		printValues(values);
		
		values = getValues();
		Sort.sort6(values);
		printValues(values);
	}
	
	public static int[] getValues() {
		int[] values = {1,20,10,30,5,5,9,0};
		return values;
	}
	
	public static void printValues(int[] values) {
		for (int i = 0; i < values.length; i++) {
			System.out.print(values[i] + ",");			
		}
		System.out.println();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值