六种常见排序算法的java实现

package edu.cn.ysw;

//八种排序算法的实现与效率分析
/*
 * 内排序的种类:
 * 1.插入排序:直接插入排序、希尔排序。
 * 2.选择排序:简单选择排序、堆排序。
 3.交换排序:冒泡排序、快速排序。
 4.归并排序
 5.基数排序
 */
public class SortedMethods {

	/**
	 * @author ysw
	 * @param args
	 * @throws Exception
	 * @since 6/15/2017
	 */
	// 直接插入排序:1.有哨兵;2.无哨兵
	// 无哨兵
	public void insertSortWithoutPre(int arr[]) {
		if (arr == null || arr.length == 0) {
			return;
		}
		// 外层循环定义排序次数
		for (int i = 1; i < arr.length; i++) {
			// 不满足条件则忽略此次判断,相当于continue;
			if (arr[i] < arr[i - 1]) {
				int tempValue = arr[i];
				int j;
				for (j = i - 1; j >= 0 && tempValue < arr[j]; j--) {
					arr[j + 1] = arr[j];
				}
				arr[j + 1] = tempValue;
			}
		}
	}

	// 有哨兵的直接插入排序
	public void insertSortWithPre(int arr[]) {
		for (int i = 2; i < arr.length; i++) {
			/*
			 * 哨兵的作用: 1:保存等待插入的数字; 2:防止数组越界的情况;
			 */
			if (arr[i] < arr[i - 1]) {
				arr[0] = arr[i];
				int j;
				for (j = i - 1; arr[0] < arr[j]; j--) {
					arr[j + 1] = arr[j];
				}
				arr[j + 1] = arr[0];
			}
		}
	}

	// 希尔排序
	public void shellSort(int arr[]) {
		if (arr == null || arr.length == 0) {
			return;
		}
		// 增量序列
		int incrementValue = arr.length / 2;
		while (incrementValue >= 1) {
			for (int i = 0; i < arr.length; i++) {
				for (int j = i + incrementValue; j < arr.length; j += incrementValue) {
					int temp = arr[j];
					int k;
					for (k = j - incrementValue; k >= 0 && arr[k] > temp; k = k
							- incrementValue) {
						arr[k + incrementValue] = arr[k];
					}
					arr[k + incrementValue] = temp;
				}
			}
			// 改变递增序列的值
			incrementValue /= 2;
		}
	}

	/*
	 * 选择排序: 1.简单选择排序 2.堆排序
	 */

	// 简单选择排序
	public void selectSort(int arr[]) {
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1; j < arr.length; j++) {
				if (arr[i] > arr[j]) {
					swap(arr, i, j);
				}
			}
		}
	}

	// 堆排序:实践中多用于调度算法,比如线程优先级调度
	// 时间驱动:取最小值或者等待时间最长

	// 冒泡排序
	public void bubbleSort(int arr[]) {
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if (arr[j] > arr[j + 1]) {
					swap(arr, j, j + 1);
				}
			}
		}
	}

	// 快速排序:挖坑填数+分治

	// 快速排序返回基准值最终位置的函数partition:回调整后基准数的位置
	public int partition(int arr[], int l, int r) {
		// 假设第一个基准值为arr[0];
		int left = l;
		int right = r;
		int key = arr[left];
		while (left < right) {
			while (left < right && arr[right] >= key) {
				right--;
			}
			if (left < right) {
				arr[left] = arr[right];
				left++;
			}
			while (left < right && arr[left] <= key) {
				left++;
			}
			if (left < right) {
				arr[right] = arr[left];
				right--;
			}
		}
		arr[left] = key;

		return left;
	}

	// 快速排序
	public void quickSort(int arr[], int l, int r) {
		if (l < r) {
			int index = partition(arr, l, r);
			quickSort(arr, l, index - 1);
			quickSort(arr, index + 1, r);
		}
	}

	// 归并排序

	public void mergeSort(int arr[]) {
		sort(arr, 0, arr.length - 1);
	}

	public void sort(int[] arr, int left, int right) {
		if (left >= right) {
			return;
		}
		int center = (left + right) / 2;
		sort(arr, left, center);
		sort(arr, center + 1, right);
		merge(arr, left, center, right);
	}

	public void merge(int[] arr, int left, int center, int right) {
		// 定义一个辅助数组来存放归并的两个子数组
		int tempArray[] = new int[arr.length];
		// 左面子数组的第一个元素
		int leftFirst = left;
		// 右面子数组的第一个元素
		int rightFirst = center + 1;
		// 指向辅助数组的第一个元素
		int tempPointer = left;
		while (leftFirst <= center && rightFirst <= right) {
			if (arr[leftFirst] <= arr[rightFirst]) {
				tempArray[tempPointer++] = arr[leftFirst++];
			} else {
				tempArray[tempPointer++] = arr[rightFirst++];

			}
		}

		// 将第一个数组中剩下的元素添加到辅助数组中
		while (leftFirst <= center) {
			tempArray[tempPointer++] = arr[leftFirst++];
		}
		// 将第二个数组中剩下的元素添加到辅助数组中
		while (rightFirst <= right) {
			tempArray[tempPointer++] = arr[rightFirst++];
		}
	}

	// 打印数组的函数
	public void printArr(int arr[]) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]);
			if (i != arr.length - 1) {
				System.out.print(",");
			}
		}
		System.out.println();
	}

	// 交换数组的元素
	public void swap(int arr[], int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	public static void main(String[] args) {
		SortedMethods sMethods = new SortedMethods();
		// 测试需要的数组
		int array1[] = { 1, 2, 3, 4, 5 };
		int array2[] = { 5, 4, 3, 2, 1 };
		int array3[] = { 4, 5, 2, 1, 7 };
		int array4[] = null;
		int array5[] = new int[0];
		// 测试无哨兵的插入排序

		System.out.println("--------有哨兵插入排序--------------");

		sMethods.insertSortWithoutPre(array1);
		sMethods.printArr(array1);
		sMethods.insertSortWithoutPre(array2);
		sMethods.printArr(array2);
		sMethods.insertSortWithoutPre(array3);
		sMethods.printArr(array3);
		/*
		 * sMethods.insertSortWithoutPre(array4); sMethods.printArr(array4);
		 * sMethods.insertSortWithoutPre(array5); sMethods.printArr(array5);
		 */
		System.out.println("--------无哨兵插入排序------------");
		// 测试有哨兵的插入排序
		sMethods.insertSortWithoutPre(array1);
		sMethods.printArr(array1);
		sMethods.insertSortWithoutPre(array2);
		sMethods.printArr(array2);
		sMethods.insertSortWithoutPre(array3);
		sMethods.printArr(array3);
		System.out.println("----------希尔排序------------");
		// 测试希尔排序
		sMethods.shellSort(array1);
		sMethods.printArr(array1);
		sMethods.shellSort(array2);
		sMethods.printArr(array2);
		sMethods.shellSort(array3);
		sMethods.printArr(array3);
		System.out.println("---------简单选择排序------------");
		sMethods.selectSort(array1);
		sMethods.printArr(array1);
		sMethods.selectSort(array2);
		sMethods.printArr(array2);
		sMethods.selectSort(array3);
		sMethods.printArr(array3);
		System.out.println("---------冒泡排序------------");
		sMethods.bubbleSort(array1);
		sMethods.printArr(array1);
		sMethods.bubbleSort(array2);
		sMethods.printArr(array2);
		sMethods.bubbleSort(array3);
		sMethods.printArr(array3);
		System.out.println("---------快速排序------------");
		sMethods.quickSort(array3, 0, array3.length - 1);
		sMethods.printArr(array3);
		System.out.println("---------归并排序排序------------");
		sMethods.mergeSort(array3);
		sMethods.printArr(array3);

	}

}

  

时间: 2024-10-05 06:01:00

六种常见排序算法的java实现的相关文章

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

常见排序算法(java实现)

常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { if (array[i] > array[j]) { tValue = array[i]; array[i] = array[j]; ar

常见排序算法及Java实现

先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取出下一个元素,在已经排序的元素序列中从后向前扫描 3.如果该

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

常见排序算法(一) MergeSort

算法思想灰常重要,常见的用到分治思想的算法包括快速排序,归并,二分搜搜,大整数乘法等(参考 http://blog.csdn.net/com_stu_zhang/article/details/7233761,归纳很到位) 简单用归并对一个数组排序 思路: 简单来说对一个数组,只要他的左右两部分都是有序的,那么简单合并就ok了,那么左右两部分可以进一步划分各自的左右两部分----明显就是要递归了 算法:归并排序 1. 将数组一分为二,subArray1 和subArray2 2. 归并排序sub

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

一文搞定十大经典排序算法(Java实现)

本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一.排序算法概述 1.定义 将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序. 2.分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较

7种基本排序算法的Java实现

7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 1 /** 2 * 直接插入排序 3 * 不稳定 4 * 时间复杂度:O(n^2) 5 * 最差时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 使用场景:大部分元素有序 8 * @param elements 9 * @param comparator 10 * @param <T> 11 */ 1

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <