排序算法分为两种:比较算法、非比较算法

本文介绍了排序算法的两大类别:比较算法和非比较算法。比较算法包括冒泡排序、选择排序、插入排序及其改进方法,以及归并排序和堆排序。非比较算法涉及计数排序、基数排序和桶排序,它们能在特定条件下实现线性时间复杂度。文章详细阐述了各个算法的原理和优化技巧,如冒泡排序的鸡尾酒排序、插入排序的二分插入和希尔排序。

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

排序算法分为两种:比较算法、非比较算法

1、比较算法时间复杂度O(nlogn) ~ O(n^2)
冒泡排序、选择排序、插入排序、归并排序、堆排序
快速排序
2、非比较排序O(n)
计数排序、基数排序、桶排序
特点:排序算法的稳定性:如果Ai = Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的
排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,前一个键排序的结果可以为后一个键排序所用

1)冒泡排序

冒泡排序算法的运作如下:
比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

#include <stdio.h>

// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(n^2)
// 最优时间复杂度 ---- 如果能在内部循环第一次运行时,使用一个旗标来表示有无需要交换的可能,可以把最优时间复杂度降低到O(n)
// 平均时间复杂度 ---- O(n^2)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 稳定

public class ArraySortTest {
   

			public void sort(int[] n) {
   
        //第一个for循环表示第几次循环
				for(int i=1;i<n.length;i++) {
   
        //第二个for循环表示该次循环进行几次比较
					for(int j=0;j<n.length-i;j++) {
   
						//判断比较是否进行换位
            if(n[j]>n[j+1]) {
   
							int temp = n[j];
							n[j] = n[j+1];
							n[j+1] = temp;
						}
					}
					print(n);
				}
			}
				public void print(int[] n) {
   
				for(int i=0;i<n.length;i++)
				//输出排完序的数组
					System.out.print(n[i] + "\t");
				System.out.println();
			}
			
			public static void main(String[] args) {
   
				ArraySortTest s = new ArraySortTest();
				//此处为需要排序的数组
				int[] n = {
   100,60,80,90,75,38};
				s.sort(n);
				s.print(n);
			}
		}   

冒泡排序的改进方法:鸡尾酒排序

public class Sad {
   
	public static void main(String[] args) {
   
		int []array= {
   32,21,54,64,12,9,89,34};
		for(int i=0;i<array.length/2;i++)
		{
   
			for(int j=0;j<array.length-i-1;j++) {
   
				if(array[j]>array[j+1])
				{
   
					int temp=array[j];
					array[j]=array[j+1];
					array[j+1]=temp;
				}
			}
		       for(int j=array.length-i-1;j>i;j--
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值