数据结构之六大排序

一、这篇博客使用Java代码实现数据结构中的六大排序
1、冒泡排序,2、选择排序,3、插入排序,4、希尔排序,5、快速排序,6、归并排序

二、Java代码实现
【1】、冒泡排序

package sort;
/**
 * 
 * @author czd
 *
 */
public class BubbleSort {
	/**
	 * 冒泡排序
	 * @param num
	 */
	public static void bubbleSort(int num[]) {
		for(int i = 0; i < num.length; i++) {
			for(int j = num.length - 1; j > i; j--) {
				if(num[j] < num[j - 1]) {
					int tem = num[j];
					num[j] = num[j - 1];
					num[j - 1] = tem;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		int num[] = {1 , 3 , 2 , 4 , 9 , 5 , 6 , 7 , 8};
		for(int i : num) {
			System.out.print(i + " ");
		}
		bubbleSort(num);
		System.out.println();
		for(int i : num) {
			System.out.print(i + " ");
		}
	}
}

【2】、选择排序

package sort;
/**
 * 
 * @author czd
 *
 */
public class SelectSort {
	/**
	 * 选择排序
	 * @param num
	 */
	private static void selectSort(int[] num) {
		for(int i = 0; i < num.length; i++) {
			int minIndex = i;
			for(int k = i + 1; k < num.length; k++) {
				if(num[k] < num[minIndex]) {
					minIndex = k;
				}
			}
			int tem = num[i];
			num[i] = num[minIndex];
			num[minIndex] = tem;
		}
	}
	
	public static void main(String[] args) {
		int num[] = {1 , 3 , 2 , 4 , 9 , 5 , 6 , 7 , 8};
		for(int i : num) {
			System.out.print(i + " ");
		}
		selectSort(num);
		System.out.println();
		for(int i : num) {
			System.out.print(i + " ");
		}
	}

	
}

【3】、插入排序

package sort;
/**
 * 
 * @author czd
 *
 */
public class InsertSort {
	/**
	 * 直接插入排序
	 * @param num
	 */
	private static void insertSort(int[] num) {
		for(int i = 1; i < num.length; i++) {
			int t = num[i];
			if(num[i] < num[i - 1]) {
				num[i] = num[i - 1];
				int k = 0;
				for( k = i - 2; k >= 0 && t < num[k]; k--) {
					num[k + 1] = num[k];
				}
				num[k + 1] = t;
			}
		}
		
	}
	
	public static void main(String[] args) {
		int num[] = {1 , 3 , 2 , 4 , 9 , 5 , 6 , 7 , 8};
		for(int i : num) {
			System.out.print(i + " ");
		}
		insertSort(num);
		System.out.println();
		for(int i : num) {
			System.out.print(i + " ");
		}
	}

	
}

【4】、希尔排序

package sort;
/**
 * 
 * @author czd
 *
 */
public class ShellSort {
	/**
	 * 希尔排序
	 * @param num
	 */
	private static void shellSort(int[] num , int d) {
		for(int i = d; i < num.length; i++) {
			int t = num[i];
			if(num[i] < num[i - d]) {
				num[i] = num[i - d];
				int k = 0;
				for( k = i - 2 * d; k >= 0 && t < num[k]; k -= d) {
					num[k + d] = num[k];
				}
				num[k + d] = t;
			}
		}
		
	}
	
	public static void main(String[] args) {
		int num[] = {1 , 3 , 2 , 4 , 9 , 5 , 6 , 7 , 8};
		for(int i : num) {
			System.out.print(i + " ");
		}
		for(int i = num.length; i >= 1;) {
			shellSort(num , i);
			i /= 2;
		}
		
		System.out.println();
		for(int i : num) {
			System.out.print(i + " ");
		}
	}

	
	
}

【5】、快速排序

package sort;
/**
 * 
 * @author czd
 *
 */
public class QuickSort {
	/**
	 * 快速排序的一趟排序
	 * @param arr
	 * @param left
	 * @param right
	 * @return
	 */
	public static int Sort(int arr[] , int left , int right) {
		int tem = arr[left];
		while(left < right) {
			while(left < right && tem < arr[right]) {
				right--;
			}
			
			if(left < right) {
				arr[left] = arr[right];
				left++;
			}
			
			while(left < right && tem > arr[left]) {
				left++;
			}
			if(left < right) {
				arr[right] = arr[left];
				right--;
			}
		}
		arr[left] = tem;
		return left;
	}
	/**
	 * 快速排序
	 * @param arr
	 * @param left
	 * @param right
	 */
	public static void quickSort(int arr[] , int left , int right) {
		if(left < right) {
			int point=Sort(arr , left , right);
			quickSort(arr , left , point-1);
			quickSort(arr , point + 1 , right);
		}
	}
	public static void main(String[] args) {
		int num[] = {1 , 3 , 2 , 4 , 9 , 5 , 6 , 7 , 8};
		for(int i : num) {
			System.out.print(i + " ");
		}
		quickSort(num , 0 , num.length - 1);
		System.out.println();
		for(int i : num) {
			System.out.print(i + " ");
		}
	}
}

【6】、归并排序

package sort;

public class MergeSort {
	/**
	 * 将两个数组进行复制
	 * @param A
	 * @param B
	 */
	public static void cope(int A[] , int B[]) {
		int k = 0;
		for(int i = 0; i < A.length; i++) {
			B[k++] = A[i];
		}
	}
	/**
	 * 返回两个数的最小值
	 * @param a
	 * @param b
	 * @return
	 */
	public static int min(int a , int b) {
		return a < b ? a : b;
	}
	
	/**
	 * 一次归并的结果排序
	 * @param num
	 * @param out
	 * @param s
	 * @param M
	 * @param N
	 */
	private static void merge(int[] num , int out[] , int s , int M , int N) {
		int i = s , j = M + 1 , k = s;
		while(i <= M && j <= N) {
			if(num[i] < num[j]) {
				out[k++] = num[i++];
			}else {
				out[k++] = num[j++];
			}
		}
		while(i <= M) {
			out[k++] = num[i++];
		}
		while(j <= N) {
			out[k++] = num[j++];
		}
		
	}
	
	public static void mergeSort(int num[] , int out[]) {
		for(int width = 1; width < num.length; width *= 2) {
			for(int i = 0; i < num.length; i = i + 2 * width ) {
				merge(num, out, i, min(i + width -1 , num.length - 1), min(i + 2 * width - 1 , num.length - 1));
			}
			cope(out, num);
		}
	}
	public static void main(String[] args) {
		int num[] = {1 , 3 , 2 , 4 , 9 , 5 , 6 , 7 , 8};
		int out[] = new int[num.length];
		for(int i : num) {
			System.out.print(i + " ");
		}
		mergeSort(num , out);
		System.out.println();
		for(int i : out) {
			System.out.print(i + " ");
		}
	}

}

【7】、堆排序

package sort;
/**
 * @Author czd
 * @Date:createed in
 * @Version: V1.0
 */
public class HeapSort {
    public static void main(String[] args) {
        int num[] = {1 , 3 , 2 , 4 , 9 , 5 , 6 , 7 , 8};
        for(int i : num) {
            System.out.print(i + " ");
        }
        heapSort(num ,  num.length);
        System.out.println();
        for(int i : num) {
            System.out.print(i + " ");
        }
    }

    public static void heapSort(int[] nums,int length){
        buildHeap(nums,length);
        for (int i = length - 1; i >= 0; i--){
            swap(nums,i,0);
            heapify(nums,i,0);
        }
    }

    public static void buildHeap(int[] nums,int length){
        int lastNode = length - 1;
        int parent = (lastNode - 1) / 2;
        int k;
        for (k = parent; k >= 0; k--){
            heapify(nums,length,k);
        }
    }

    public static void heapify(int[] nums, int length,int i){
        if (i >= length){
            return;
        }
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int max = i;
        if (left < length && nums[max] < nums[left]){
            max = left;
        }
        if (right < length && nums[max] < nums[right]){
            max = right;
        }

        if (max != i){
            swap(nums,max,i);
            heapify(nums,length,max);
        }
    }

    private static void swap(int[] nums, int max, int i) {
        int temp = nums[max];
        nums[max] = nums[i];
        nums[i] = temp;
    }
}

你可能感兴趣的:(数据结构)