八大基础排序中(直接插入排序,希尔排序,冒泡排序, 快速排序,归并排序,简单选择排序)

Posted 误入IT界的农民工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八大基础排序中(直接插入排序,希尔排序,冒泡排序, 快速排序,归并排序,简单选择排序)相关的知识,希望对你有一定的参考价值。

package com.wang.sort;

import java.util.Arrays;

public class Sort {
	
	/**
	 * 1.直接插入排序
	 * 思想:当前数与前面已经排好顺序的数进行比较,插入到合适的位置
	 * @param arra
	 */
	public void simpleSort(int[] arra) {
		
		for (int i = 1; i < arra.length; i++) {
			int temp = arra[i];
			int j = i -1;
			for (; j >= 0 && arra[j] > temp; j--) {
				arra[j + 1] = arra[j];
			}
			arra[j+1] = temp;	
		}
		
	}
	
	/**
	 * 2.冒泡排序
	 * 思想:相邻的两个数比较,找到最大的数往下沉
	 * @param args
	 */
	public void bubbleSort(int[] arra) {
	    int temp;
		for (int i = 0; i < arra.length - 1; i++) {
			for (int j = 0; j < arra.length - 1 - i; j++) {
				if (arra[j] > arra[j+1]) {
					temp = arra[j];
					arra[j] = arra[j+1];
					arra[j+1] = temp;
				}
			}
		}
	}
	/**
	 * 找中间值
	 * @param arra
	 * @param low
	 * @param hight
	 */
	public static int getMiddle(int[] arra, int low, int hight) {
		int temp = arra[low];
		while (low < hight) {
			while (low < hight && arra[hight] > temp) {
				hight--;
			}
			arra[low] = arra[hight];
			while(low < hight && arra[low] <= temp) {
				low++;
			}
			arra[hight] = arra[low];
		}
		arra[low] = temp;
		return low;
	}
	/**
	 * 3.快速排序
	 * 思想:找一个中间值,将比中间值大的放到中间值的右边,小的放到左边,依此进行递归
	 * @param arra
	 * @param low
	 * @param hight
	 */
	public static void qickSort(int[] arra, int low, int hight) {
		if (low > hight) {
			return;
		}
		int middle = getMiddle(arra, low, hight);
		qickSort(arra, low, middle -1);
		qickSort(arra, middle + 1, hight);
	}
	
	

	/**
	 * 归并排序
	 * @param arra
	 * @param left
	 * @param center
	 * @param right
	 */
	
	public static void merge(int[] arra, int left, int center, int right) {
		int[] tempArr = new int[right - left + 1];
		int temp = left;
		int mid = center + 1;
		int third = 0;
		
		while(temp <= center && mid <= right) {
			if (arra[temp] < arra[mid]) {
				tempArr[third++] = arra[temp++];
			} else {
				tempArr[third++] = arra[mid++];
			}			
		}
		
		while(temp <= center) {
			tempArr[third++] = arra[temp++];
		}
		
		while (mid <= right) {
			tempArr[third++] = arra[mid++];
		}
		
		
		for (int i = 0; i < tempArr.length; i++) {
			arra[i + left] = tempArr[i];
		}
	}
	
	/**
	 * 4.归并排序
	 * @param arra
	 * @param left
	 * @param right
	 */
	public void mergingSort(int arra[], int left, int right) {
		if (left < right) {
			int center = (left + right) / 2;
			mergingSort(arra, left, center);
			mergingSort(arra, center + 1, right);
			merge(arra, left, center, right);
		}
		
	}
	
	/**
	 * 5.希尔排序
	 * @param args
	 */
	public static void shellSort(int[] array) {  
	    int i;  
	    int j;  
	    int temp;  
	    int gap = 1;  
	    int len = array.length;  
	    while (gap < len / 3) { 
	    	gap = gap * 3 + 1; 
	    }  
	    for (; gap > 0; gap /= 3) {  
	        for (i = gap; i < len; i++) {  
	            temp = array[i];  
	            for (j = i - gap; j >= 0 && array[j] > temp; j -= gap) {  
	                array[j + gap] = array[j];  
	            }  
	            array[j + gap] = temp;  
	        }  
	    }  
	    System.out.println(Arrays.toString(array) + " shellSort");  
	}
	/**
	 * 5.希尔排序
	 * @param arra
	 */
	public void shelllSort(int[] arra) {
		int j = 0;
		int temp = 0;
		for (int step = arra.length / 2; step > 0; step /= 2) {
			for (int i = step; i < arra.length; i++) {
				temp = arra[i];
				for (j = i - step; j >= 0 && arra[j] > temp; j -= step) {
					arra[j + step] = arra[j];
				}
				arra[j + step] = temp;
			}
			
		}
	}
	
	
	/**
	 * 6.简单选择排序
	 * 思想:找出最小的放到第一位,第二小的放到第二位,依次类推
	 * @param args
	 */
	public void selectSort(int[] arra) {
		
		int position = 0;
		for (int i = 0; i < arra.length; i++) {
			int j = i + 1;
			position = i;
			int temp = arra[i];
			for (; j < arra.length; j++) {
				if (arra[j] < temp) {
					temp =  arra[j];
					position = j;
				}
			}
			arra[position] = arra[i];
			arra[i] = temp;
		}
		
		
	}
	
	
	/**
	 * 7.基数排序
	 * @param args
	 */
	
	
	/**
	 * 8.堆排序
	 * @param args
	 */
	
	
	
	
	
	public static void main(String[] args) {
		Sort sort = new Sort();
		int[] arra = {1,2,3,9,6,8,5,10};
//		sort.simpleSort(arra);  //简单排序
//		sort.bubbleSort(arra);  //冒泡排序
//		Sort.qickSort(arra, 0, arra.length - 1);  //快速排序
//		sort.mergingSort(arra, 0, arra.length - 1);
		sort.shelllSort(arra);
		for (int i = 0; i < arra.length; i++) {
			System.out.println(arra[i]);
		}
	}

}


  

以上是关于八大基础排序中(直接插入排序,希尔排序,冒泡排序, 快速排序,归并排序,简单选择排序)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构c语言版八大算法(上)图文详解带你快速掌握——希尔排序,堆排序,插入排序,选择排序,冒泡排序!

八大内部排序算法之希尔堆排序插入排序算法

八大排序算法C语言过程图解+代码实现(插入,希尔,选择,堆排,冒泡,快排,归并,计数)

八大基础排序总结

[八大排序]0基础C语言实现八大排序,详解快排,归并,希尔

八大排序算法