• 用Java来写常见的排序算法



    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下

      

    package com.huwei.sort;
    
    /**
     * 各种排序算法
     * 
     * @author huwei
     * 
     */
    public class Sort {
    	public static void main(String[] args) {
    		int[] a = { 60, 57, 89, 47, 57, 98, 45, 35, 73 };
    		Sort sort = new Sort();
    		sort.quickSort(a);
    		for (int i = 0; i < a.length; i++) {
    			System.out.print(" " + a[i] + " ");
    		}
    	}
    
    	/**
    	 * 插入排序
    	 * 
    	 * @param data
    	 */
    	public void insertSort(int[] data) {
    		for (int i = 1; i < data.length; i++) {
    			for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) {
    				swap(data, j, j - 1);
    			}
    		}
    	}
    
    	/**
    	 * 冒泡排序
    	 * 
    	 * @param data
    	 */
    	public void bubbleSort(int[] data) {
    		for (int i = 0; i < data.length; i++) {
    			for (int j = data.length - 1; j > i; j--) {
    				if (data[j] < data[j - 1]) {
    					swap(data, j, j - 1);
    				}
    			}
    		}
    
    	}
    
    	/**
    	 * 选择排序
    	 * 
    	 * @param data
    	 */
    	public void selectSort(int[] data) {
    		for (int i = 0; i < data.length; i++) {
    			int lowIndex = i;
    			for (int j = data.length - 1; j > i; j--) {
    				if (data[j] < data[lowIndex]) {
    					lowIndex = j;
    				}
    			}
    			swap(data, i, lowIndex);
    		}
    	}
    
    	/**
    	 * shell排序
    	 * 
    	 * @param data
    	 */
    	public void shellSort(int[] data) {
    		for (int i = data.length / 2; i > 2; i /= 2) {
    			for (int j = 0; j < i; j++) {
    				insertSort(data, j, i);
    			}
    		}
    		insertSort(data, 0, 1);// 最后进行一次插入排序
    	}
    
    	private void insertSort(int[] data, int start, int inc) {
    		for (int i = start + inc; i < data.length; i += inc) {
    			for (int j = i; (j >= inc) && (data[j] < data[j - inc]); j -= inc) {
    				swap(data, j, j - inc);
    			}
    		}
    	}
    
    	/**
    	 * 快速排序 重点
    	 * 
    	 * @param data
    	 */
    	public void quickSort(int[] data) {
    		quickSort(data, 0, data.length - 1);
    	}
    
    	private void quickSort(int[] data, int i, int j) {
    		int pivotIndex = (i + j) / 2;
    		// swap
    		swap(data, pivotIndex, j);
    
    		int k = partition(data, i - 1, j, data[j]);
    		swap(data, k, j);
    		if ((k - i) > 1)
    			quickSort(data, i, k - 1);
    		if ((j - k) > 1)
    			quickSort(data, k + 1, j);
    
    	}
    
    	private int partition(int[] data, int l, int r, int pivot) {
    		do {
    			while (data[++l] < pivot)
    				;
    			while ((r != 0) && data[--r] > pivot)
    				;
    			swap(data, l, r);
    		} while (l < r);
    		swap(data, l, r);
    		return l;
    	}
    
    	/**
    	 * 归并排序
    	 * 
    	 * @param data
    	 */
    	public void mergeSort(int[] data) {
    		int[] temp = new int[data.length];
    		mergeSort(data, temp, 0, data.length - 1);
    	}
    
    	private void mergeSort(int[] data, int[] temp, int l, int r) {
    		int mid = (l + r) / 2;
    		if (l == r)
    			return;
    		mergeSort(data, temp, l, mid);
    		mergeSort(data, temp, mid + 1, r);
    		for (int i = l; i <= r; i++) {
    			temp[i] = data[i];
    		}
    		int i1 = l;
    		int i2 = mid + 1;
    		for (int cur = l; cur <= r; cur++) {
    			if (i1 == mid + 1)
    				data[cur] = temp[i2++];
    			else if (i2 > r)
    				data[cur] = temp[i1++];
    			else if (temp[i1] < temp[i2])
    				data[cur] = temp[i1++];
    			else
    				data[cur] = temp[i2++];
    		}
    	}
    
    	/**
    	 * 堆排序
    	 * 
    	 * @param data
    	 */
    	public void heapSort(int[] data) {
    		MaxHeap h = new MaxHeap();
    		h.init(data);
    		for (int i = 0; i < data.length; i++)
    			h.remove();
    		System.arraycopy(h.queue, 1, data, 0, data.length);
    	}
    
    	private static class MaxHeap {
    
    		void init(int[] data) {
    			this.queue = new int[data.length + 1];
    			for (int i = 0; i < data.length; i++) {
    				queue[++size] = data[i];
    				fixUp(size);
    			}
    		}
    
    		private int size = 0;
    
    		private int[] queue;
    
    	/*	public int get() {
    			return queue[1];
    		}*/
    
    		public void remove() {
    			swap(queue, 1, size--);
    			fixDown(1);
    		}
    
    		// fixdown
    		private void fixDown(int k) {
    			int j;
    			while ((j = k << 1) <= size) {
    				if (j < size && queue[j] < queue[j + 1])
    					j++;
    				if (queue[k] > queue[j]) // 不用交换
    					break;
    				swap(queue, j, k);
    				k = j;
    			}
    		}
    
    		private void fixUp(int k) {
    			while (k > 1) {
    				int j = k >> 1;
    				if (queue[j] > queue[k])
    					break;
    				swap(queue, j, k);
    				k = j;
    			}
    		}
    
    	}
    
    	public static void swap(int[] data, int i, int j) {
    		int temp = data[i];
    		data[i] = data[j];
    		data[j] = temp;
    	}
    }
    

      

  • 相关阅读:
    RabbitMQ学习之集群消息可靠性测试
    RabbitMQ学习之集群镜像模式配置
    (转)RabbitMQ学习之集群部署
    RabbitMQ学习之集群模式
    RabbitMQ学习之spring配置文件rabbit标签的使用
    RabbitMQ学习之messageconver插件实现(Gson)
    RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
    RabbitMQ学习之基于spring-rabbitmq的消息异步发送
    (转)RabbitMQ学习之spring整合发送异步消息(注解实现)
    范仁义js课程---16、非bool值的逻辑运算
  • 原文地址:https://www.cnblogs.com/huwei0814/p/3840227.html
Copyright © 2020-2023  润新知