java实现七种经典排序算法

这篇具有很好参考价值的文章主要介绍了java实现七种经典排序算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单算法:冒泡,简单选择,直接插入

改进算法:希尔,堆,归并,快速

直接插入排序:将一个记录插入到已经拍好的有序列表中,从而得到一个新的、记录数增加1的有序表。

冒泡排序:两两比较,反序交换。每趟将最大(小 )的浮到最上面或沉到最底下。

简单选择排序:通过关键字之间的比较,每次将剩余的记录中选择最小的与指定位置交换。

希尔排序:跳跃的插入排序,选择某个增量,对间隔增量的子序列进行排序,随着增量递减,逐步完成所有值的排序。

堆排序:将待排序序列构建成一个大顶堆,此时整个序列最大值就是根节点。将它和末尾元素交换,随后将剩余的n-1个元素重新构造成一个堆,以此类推。

归并排序:拆分,随后重组。

快速排序:通过一趟排序将待排记录分成独立的两部分,一部分都小于另一部分,随后对两部分分别进行再次排序,以达到整体有序。

(所有代码均可独立运行成功)


冒泡排序:

import java.util.Arrays;

/**
 * 冒泡排序算法
 * 两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止
 * @author 诸葛浪
 *
 */
public class BubbleSortDemo {
	public static void bubbleSort0(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 static void bubbleSort(int[] arr) {
		//从后往前 两两比较 每一轮把最小的转移到i的位置
		for(int i=0;i<arr.length;i++)
			for(int j = arr.length-1;j>i;j--)//for(int j=0 ; j<arr.length-1-i ; j++) 从前往后也可以 每一趟把最大的放最后	
				if(arr[j-1] > arr[j])
					swap(arr, j-1, j);
	}
	public static void bubbleSort2(int[] arr) {
		//改进版 如果一趟下来没有交换 说明有序 之后就不必循环判断了
		boolean flag = true;//用以记录是否发生交换
		for(int i = 0;i<arr.length&&flag;i++) {
			flag = false;
			for(int j = arr.length - 1;j>i;j--) {
				if(arr[j-1] > arr[j]) {		
					swap(arr, j-1, j);
					flag = true;
				}
			}
		}
	}
	public static void main(String[] args) {
		int[] arrTest = {9,1,5,8,3,7,4,6,2};
		System.out.println("before: " +	Arrays.toString(arrTest));
		bubbleSort2(arrTest);
		System.out.println("after: " + Arrays.toString(arrTest));
	}
	public static void swap(int[] arr , int i, int j) {
		//交换数组两元素
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}

java排序算法,算法代码总结,排序算法,java,算法

 

直接插入排序:

import java.util.Arrays;

/**
 * 插入排序算法
 * 基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个记录数+1的有序表
 * @author 诸葛浪
 *
 */
public class InsertSortDemo {
	
	public static void insertSort(int[] arr) {
		//设置一个辅助空间arr[0]
		for(int i =2;i<arr.length;i++	) {
			if(arr[i] < arr[i-1]) {		//需要将arr[i]插入有序子表
				arr[0] = arr[i];//设置哨兵
				int j;
				for(j = i-1;arr[j] > arr[0];j--)
					arr[j+1] = arr[j];//记录后移
				arr[j+1] = arr[0];//插入到正确位置
			}
		}
	}
	public static void main(String[] args) {
		int[] arrTest = {0,1,5,8,3,7,4,6,2};
		System.out.println("before: " +	Arrays.toString(arrTest));
		insertSort(arrTest);
		System.out.println("after: " + Arrays.toString(arrTest));

	}

}

java排序算法,算法代码总结,排序算法,java,算法

简单选择排序

import java.util.Arrays;

/**
 * 简单选择排序
 * 基本思想是每一趟在n-i个记录中选择最小的作为第i个记录(从0开始)
 * 
 * @author 诸葛浪
 *
 */
public class SelectSortDemo {
	public static void selectSort(int[] arr) {
		//选择排序 每一趟找到最小的放到i的位置
		for(int i=0;i<arr.length;i++) {
			int min = i;//将当前下标定义为最小值下标
			for(int j = i+1; j<arr.length;j++)	{
				if(arr[min] > arr[j]	)//如果有小于当前最小值的关键字
					min = j;	  //将此下标赋值给min
			}
			if(i != min)//有更改 则交换
				swap(arr, i, min);
		}
	}
	public static void main(String[] args) {
		int[] arrTest = {9,1,5,8,3,7,4,6,2};
		System.out.println("before: " +	Arrays.toString(arrTest));
		selectSort(arrTest);
		System.out.println("after: " + Arrays.toString(arrTest));
	}
	public static void swap(int[] arr , int i, int j) {
		//交换数组两元素
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}

java排序算法,算法代码总结,排序算法,java,算法

希尔排序:

import java.util.Arrays;

/**
 * 希尔排序 又叫增量递减排序
 * 将相距某个”增量“的记录组成一个子序列
 * 保证在子序列内分别进行直接插入排序后得到的结果是基本有序的
 * 直接插入排序的升级版
 * @author 诸葛浪
 *
 */
public class ShellSortDemo {
	public static void shellSort(int[] arr) {
		//增量递减的插入排序
		int increment = arr.length;
		do {
			increment = increment / 3 + 1;
			for(int i = increment + 1 ; i < arr.length; i++) {
				if(arr[i] < arr[i - increment]) {//对间隔增量的位置进行比较
					arr[0] = arr[i];//暂存在0
					int j;
					for(j = i - increment; j> 0 && arr[0] < arr[j]; j -= increment)
						arr[j+increment] = arr[j];//记录后移 查找插入位置
					arr[j+increment] = arr[0];			
				}
			}
		}while(increment > 1);
	}
	public static void main(String[] args) {
		int[] arrTest = {0,1,5,8,3,7,4,6,2};
		System.out.println("before: " +	Arrays.toString(arrTest));
		shellSort(arrTest);
		System.out.println("after: " + Arrays.toString(arrTest));
	}
}

java排序算法,算法代码总结,排序算法,java,算法

 

堆排序:


import java.util.Arrays;

/**
 * 堆排序 利用完全二叉树的结构
 * 对于完全二叉树来说,层序遍历之后如果i>1 则i/2(向上取整3.5->3)为其双亲节点
 * 而双亲节点均大于或小于子节点
 * 根节点最大称大顶堆 否则小顶堆
 * 通过不断移除根节点(与末尾结点交换)并重新组织成堆
 * 从而得到有序序列
 * 简单选择排序的升级版
 * @author 诸葛浪
 *
 */
public class HeapSortDemo {
	public static void heapSort(int[] arr) {
		for(int i = (arr.length-1)/2; i>0;i--) 
			heapAdjust(arr, i, arr.length-1);
		for(int i = (arr.length-1);i>1;i--) {
			swap(arr, 1, i);
			heapAdjust(arr, 1, i-1);
		}
	}
	public static void heapAdjust(int[] arr, int s, int m) {
		//将s到m调整为大顶堆
		int temp = arr[s];
		for(int j = s*2;j<=m;j*=2) {//左孩子节点2*s 右孩子2*s+1
			if(j < m && arr[j] < arr[j+1])//左孩子小于右孩子 j指向右孩子
				++j;
			if(temp >= arr[j])//根节点大于右孩子 满足大顶堆特性 跳出循环
				break;
			arr[s] = arr[j];//否则将大节点赋值给根节点
			s = j;//根节点向下指向孩子节点
		}
		arr[s]  = temp;

	}
	public static void swap(int[] arr , int first, int next) {
		//交换数组两元素
		int temp = arr[first];
		arr[first] = arr[next];
		arr[next] = temp;
	}
	
	public static void main(String[] args) {
		int[] arrTest = {0,50,10,90,30,70,40,80,60,20};
		System.out.println("before: " +	Arrays.toString(arrTest));
		heapSort(arrTest);
		System.out.println("after: " + Arrays.toString(arrTest));
	}
}

java排序算法,算法代码总结,排序算法,java,算法

java排序算法,算法代码总结,排序算法,java,算法

归并排序:

import java.util.Arrays;

/**
 * 归并排序算法
 * 假设初始序列含有n个记录 则可以看成是n个有序的子序列 每个子序列长度为1
 * 然后两两归并 得到n/2(向上取整)个长度为2或1的有序子序列 两两归并 如此重复 
 * 直到得到长度为n的有序序列为止 称为2路归并
 * 一种拆分到最小 并从最小合并成最大的思路
 * 拆分之后的归并实际上是选择排序的一种
 * @author 诸葛浪
 *
 */
public class MergeSortDemo {
	public static void mergeSort(int[] arr ) {
		mSort(arr, arr, 0, arr.length-1);
	}
	public static void mSort(int[] SR,int[] TR1,int s, int t ) {
		int m;
		int[] TR2 = new int[SR.length + 1];
		if(s == t)//递归返回条件 拆分至最小了
			TR1[s] = SR[s];
		else {
			m = (s+t)/2; //将SR[s..t]分成s到m和m+1到t
			mSort(SR, TR2, s, m); //递归地将SR[s...m]归并为有序的TR2[s..m]
			mSort(SR, TR2, m+1, t); //同上
			merge(TR2,TR1,s,m,t);//TR2归并到TR1中
		}
	}
	public static void merge(int[] SR,int[] TR,int i, int m ,int n ) {
		//将有序的SR[i..m]和SR[m+1...n]归并为有序的TR[i...n]
		int j,k,l;
		for(j = m+1,k=i;i<=m&&j<=n;k++) {//两半里面挨个挑 将SR中记录由小到大并入TR
			if(SR[i] < SR[j])//比较符号反过来就是从大到小的排序
				TR[k] = SR[i++];
			else
				TR[k] = SR[j++];
		}
		//剩下哪个全都归入TR数组
		if(i <= m)
			for(l = 0;l<=m-i;l++)
				TR[k+l] = SR[i+l];
		if(j <= n)
			for(l = 0;l<=n-j;l++)
				TR[k+l] = SR[j+l];
	}
	public static void main(String[] args) {
		int[] arrTest = {50,10,90,30,70,40,80,60,20};
		System.out.println("before: " +	Arrays.toString(arrTest));
		mergeSort(arrTest);
		System.out.println("after: " + Arrays.toString(arrTest));
	}
}

快速排序:


import java.util.Arrays;

/**
 * 快速排序算法
 * 属于交换排序 
 * 基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小
 * 则可以分别对这两个部分继续进行排序 以达到整个序列有序的目的
 * 
 * @author 诸葛浪
 *
 */
public class QuickSortDemo {
	public static void quickSort(int[] arr) {
		qSort(arr, 0, arr.length-1);
	}
	
	/*对arr中的子序列arr[low...high]做快速排序*/
	public static void qSort(int[] arr, int low,int high) {
		int pivot;//枢轴变量
		if(low < high) {
			//将arr[]一分为二 算出枢轴值pivot
			//pivot = partition(arr, low ,high);
			pivot = partition1(arr, low, high);
			qSort(arr, low, pivot-1);//对低子表进行递归排序
			qSort(arr, pivot+1, high);//对高子表进行递归排序
		}
	}

	/*交换arr中字表的记录 使枢轴记录到位 并返回其所在位置,此时在它之前均不大于他 之后均不小于他*/
	public static int partition(int[] arr, int low, int high) {
		int pivotKey = arr[low];//用子表的第一个记录作为枢轴值
		while(low < high) {//low和high双指针不断向中间靠拢,枢轴值也在不断移动 性能依赖枢轴值在序列中的分布
			//另一个版本中也可以不移动枢轴值 最后赋值皆可
			while(low < high && arr[high] >= pivotKey)
				high--;
			swap(arr, low, high);
			while(low < high && arr[low] <= pivotKey)
				low++;
			swap(arr, low, high);
		}
		return low;
	}
	public static int partition1(int[] arr, int low, int high) {
		int pivotKey ;//用子表三数取中法 作为枢轴值
		int m = low +(high - low) /2;//找到序列中间位置
		if(arr[low] > arr[high])
			swap(arr, low, high);
		if(arr[m] > arr[high])
			swap(arr, high, m);
		if(arr[m] > arr[low])
			swap(arr, m, low);
		pivotKey = arr[low];//此时枢轴值选择为左中右三个数中位数值

		while(low < high) {
			//可以不移动枢轴值 最后赋值皆可
			while(low < high && arr[high] >= pivotKey)
				high--;
			arr[low] = arr[high]; //改为直接赋值
			while(low < high && arr[low] <= pivotKey)
				low++;
			arr[high] = arr[low];
		}
		arr[low] = pivotKey;
		return low;
	}
	public static 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) {
		int[] arrTest = {50,10,90,30,70,40,80,60,20};
		System.out.println("before: " +	Arrays.toString(arrTest));
		quickSort(arrTest);
		System.out.println("after: " + Arrays.toString(arrTest));
	}

}

快排和归并的示意图:

java排序算法,算法代码总结,排序算法,java,算法


 

再加一个啊哈磊的图文章来源地址https://www.toymoban.com/news/detail-609777.html

到了这里,关于java实现七种经典排序算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【八大经典排序算法】快速排序

    说到快速排序就不得不提到它的创始人 hoare了。在20世纪50年代,计算机科学家们开始研究如何对数据进行排序,以提高计算机程序的效率。当时,常用的排序算法包括冒泡排序、插入排序和选择排序等。 然而,这些算法的效率都相对较低,特别是在处理大量数据时。于是,

    2024年02月07日
    浏览(49)
  • 【数据结构与算法】十大经典排序算法-希尔排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 希尔排序是一种插入排序的改进版本,旨在解决插入排序在处理大规模数据时的效率问题。通过将数组分为多个子序列并对

    2024年02月12日
    浏览(80)
  • 【数据结构与算法】十大经典排序算法-快速排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 快速排序(Quick Sort)是一种高效的排序算法,是对冒泡排序的优化。它采用分治法(Divide and Conquer)的思想,将待排序序列

    2024年02月13日
    浏览(65)
  • 【数据结构与算法】十大经典排序算法-冒泡排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌴 掘金 :HelloCode 🌞 知乎 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地交换相邻元素的位置来将最大(或最小)的元素逐步“冒泡”到

    2024年02月14日
    浏览(75)
  • 【数据结构与算法】十大经典排序算法-插入排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 插入排序(Insertion Sort)是一种简单直观的排序算法,其基本思想是将一个记录插入到已排好序的有序序列中,直到所有记录

    2024年02月13日
    浏览(83)
  • 七大排序算法——堆排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月16日
    浏览(34)
  • 七大排序算法——冒泡排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月16日
    浏览(39)
  • 七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月15日
    浏览(46)
  • 七大排序算法——希尔排序,通俗易懂的思路讲解与图解(完整Java代码)

    排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 上述待排序的数中,有两个5。 将 前面 的5标记一个a, 将 后面 的5标记一个b。 通过算法进行排序后,这一组数就有序了, 但是要看两个相同的5的位置是否有改变。

    2024年02月03日
    浏览(52)
  • 【算法】经典的八大排序算法

    点击链接 可视化排序 动态演示各个排序算法来加深理解,大致如下 原理 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次比较和交换相邻元素的方式,将最大(或最小)的元素逐步冒泡到数组的一端。每一轮冒泡将会将未排序部分中最大(或最小)的元素“浮”

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包