常用7种排序算法java实现

本文详细介绍了七种常见的排序算法(冒泡排序、简单选择排序、直接插入排序、希尔排序、堆排序、归并排序和快速排序)的Java实现方法,并分析了它们的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面已经把七种排序算法用java实现,也分析了时间复杂度。

这篇是将7种排序方法综合到一个类里,便于快速复习。

可以参考我前面的七篇:点击打开链接

public class SortClass {
	//==========================冒泡排序========================//
	public static  void bubble_sort(int[] arr)
	{
		for(int i = 0; i < arr.length; i ++)
		{
			for(int j = arr.length-2; j>=i; j--)
			{
				if(arr[j] > arr[j+1])
				{
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}
	//==========================冒泡排序========================//
	
	//=========================简单选择排序======================//
	public static void Select_Sort(int[] arr)
	{
		int min;  //记录第i次循环的最小值
		for(int i = 0; i < arr.length; i ++)
		{
			min = i;  //假设第i个元素为最小值
			for (int j = i + 1; j < arr.length; j++) 
			{
				if(arr[min] > arr[j])  //如果最小值比i后面的值要大,则更换min
					min = j;
			}
			if(i != min)              //交换第i次循环中,最小值与i的位置
			{
				int temp = arr[i];  
				arr[i] = arr[min];
				arr[min] = temp;
			}
		}
	}
	//=========================简单选择排序======================//
	
	//==========================直接插入排序====================//
	public static void Insert_Sort(int[] arr)
	{
		for(int i = 1; i < arr.length; i ++)
		{
			int j,temp;
			if(arr[i] < arr[i-1])
			{
				temp = arr[i];
				for(j = i-1; j >= 0 && arr[j] > temp; j--)  //arr[j]>temp,将大于temp(arr[i])的部分向右移动一位
				{					//如现在是 {1,3,4,5},temp=arr[i]=2,那么 将arr[j]>2的部分
					arr[j+1] = arr[j];		//也就是 3,4,5向后移动一个位置,这个时候再把 temp也就是arr[i] = 2
				}						//插入3的位置。
				arr[j+1] = temp;  //将temp(arr[i])插入进去
			}
		}
	}
	//==========================直接插入排序====================//
	
	//==========================希尔排序========================//
	public static void Shell_Sort(int[] arr)
	{
		int increment = arr.length;
		int i, j, temp;
		do {
			increment = increment/3 + 1;
			for(i = increment + 1; i < arr.length; i ++)
			{
				if(arr[i] < arr[i-increment])
				{
					temp = arr[i];
					for(j = i - increment; j > 0 && arr[j] > temp; j-=increment) //大于temp(arr[i])的后移
						arr[j+increment] = arr[j];
					arr[j+increment] = temp;         //将arr[i]插入
				}
				
			}
		} while (increment > 1);
	}
	//==========================希尔排序========================//
	
	//===========================堆排序=======================//
	public static void HeapAdjust(int[] arr, int s, int m)  //构建大顶堆
	{
		int temp, j;
		temp = arr[s];
		for(j = 2*s; j < m; j *= 2)   /*沿关键字较大的孩子节点向下筛选*/
		{
			if(j < m && arr[j] < arr[j+1])
				++j;                			 /*j为关键字中较大的记录下标*/
			if(temp >= arr[j])
				break;                  /*如果temp(也就是根节点)大于左右孩子的最大值,就不用交换,退出循环*/
			arr[s] = arr[j];
			s = j;
		}
		arr[s] = temp;
	}
	
	public static void Heap_Sort(int[] arr)
	{
		int i;
		for(i = arr.length/2; i >= 0; i--)  //将arr构建成大顶堆
		{
			HeapAdjust(arr, i, arr.length-1);
		}
		
		for(i = arr.length-1; i >= 0; i--)   //每次循环取出大顶堆的根节点,也就是最大值放在最后一个元素
		{					//将剩下的i-1个元素继续构建成大顶堆
			int temp = arr[0];
			arr[0] = arr[i];
			arr[i] = temp;
			HeapAdjust(arr, 0, i-1);
		}
	}
	//======================堆排序===========================//
	
	//==========================归并排序===================//
	public static void Merge_Sort(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];
		if(s == t)
			TR1[s] = SR[s];
		else
		{
			m = (s + t)/2;   //将SR[s..t]平分为SR[s..m] 和 SR[m+1..t]
			MSort(SR, TR2, s, m); //递归将SR[s..m]归并为有序的TR2[s..m]
			MSort(SR, TR2, m+1, t);  //递归将SR[m+1..t]归并为有序TR2[m+1..t]
			Merge(TR2, TR1, s, m, t);  //将TR2[s..m] 和 TR2[m+1..t]归并到TR1[s..t]
		}
	}
	//将有序的SR[i..m] 和 SR[m+1..n] 归并为有序的 TR[i..n]
	public static void Merge(int[] SR, int[] TR, int i, int m, int 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++];
		}
		if(i <= m)
		{
			for(l = 0; l <= m - i; l ++)
				TR[k+l] = SR[i+l];    //将剩余的SR[i..m]赋复制到TR
		}
		if(j <= n)
		{
			for(l = 0; l <= n-j; l ++)
				TR[k+l] = SR[j+l];
		}
	}
	//==========================归并排序===========================//
	
	//======================快速排序============================//
	public static void Quick_Sort(int[] arr)
	{
		QSort(arr, 0, arr.length-1);
	}
	public static void QSort(int[] arr, int low, int high)  //对arr中的子序列arr[low..high]作快速排序
	{
		int pivot;
		if(low < high)
		{
			pivot = Partition(arr, low, high);   //将arr一分为二,算出枢轴pivot。小于pivot放在pivot左侧,
												//大于pivot放在pivot右侧,以此枢轴分割序列,再次递归
			QSort(arr, low, pivot-1);      //对小于pivot子序列递归排序
			QSort(arr, pivot+1, high);   //对大于pivot子序列递归排序
		}
	}
	
	//交换arr中子序列的记录,设定一个pivot,是小于枢轴在pivot左侧,
	//大于pivot在右侧,此时pivot在中间,并记录pivot的下标,返回
	public static int Partition(int[] arr, int low, int high)
	{
		int pivotKey, temp;
		pivotKey = arr[low];  //用子序列的第一个记录作为枢轴记录
		while(low < high)   //从数组两端交替向中间扫描
		{
			while(low < high && arr[high] >= pivotKey)
				high--;
			temp = arr[high];      //  将比枢轴记录小
			arr[high] = arr[low];  //  的记录
			arr[low] = temp;      //   交换到低端
			while(low < high && arr[low] <= pivotKey)
				low++;
			temp = arr[low];      //  将比枢轴记录大
			arr[low] = arr[high]; //  的记录
			arr[high] = temp;     //  交换到高端
		}
		return low;       //返回枢轴所在位置,
	}
	//=======================快速排序==========================//
	
	public static void main(String[] args) {
		int[] arr = {0,3,1,2,5,6,8,7,3,33};
		Quick_Sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值