排序算法时间比较

下面是冒泡排序, 选择排序, 插入排序, 快速排序, 归并排序, 堆排序和他们执行时间比较

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class Sort {
	public static void popsort(List<Integer> A){
		int n = A.size();
		int count = 0;
		for(int i=n-1; i>0; i--){
			for(int j=0; j<i; j++){
				count++;
				if(A.get(j)>A.get(j+1)){
					int tmp = A.get(j);
					A.set(j, A.get(j+1));
					A.set(j+1, tmp);
				}
			}
		}
		System.out.println("count="+count);
	}
	public static void selectsort(List<Integer> A){
		int n = A.size();
		int count = 0;
		for(int i=0; i<n; i++){
			int min = A.get(i), mp = i;
			for(int j=i+1; j<n; j++){
				count++;
				if(A.get(j)<min){
					min = A.get(j);
					mp = j;
				}
			}
			if(count!=i){
				A.set(mp, A.get(i));
				A.set(i, min);
			}
		}
		System.out.println("count = "+count);
	}
	public static void insertsort(List<Integer> A){
		int n = A.size();
		int count = 0;
		for(int i=2; i<n; i++){
			int tmp = A.get(i), mp = i;
			for(int j=i-1; j>=0; j--){
				count ++;
				if(A.get(j)>tmp){
					A.set(j+1, A.get(j));
					mp = j;
				}
			}
			if(mp!=i){
				A.set(mp, tmp);
			}
		}
		System.out.println("count = "+count );
	}
	public static int quicksort(List<Integer> A, int s, int e){
		int X = A.get(s), i = s, j = e;
		int count = 0;
		while(i!=j){
			while(i<j&&A.get(j)>X) {
				j--;
				count++;
			}
			if(i==j) break;
			A.set(i, A.get(j));
			i++;
			while(i<j&&A.get(i)<X){
				count++;
				i++;
			}
			if(i==j) break;
			A.set(j, A.get(i));
			count++;
			j--;
		}
		A.set(i, X);
		if(i-1>s) count += quicksort(A, s, i-1);
		if(j+1<e) count += quicksort(A, j+1, e);
		return count;
	}
	static List<Integer> merge(List<Integer> list1, List<Integer> list2){
		List<Integer> output = new ArrayList<Integer>();
		int m = list1.size(), n = list2.size();
		int i = 0, j = 0;
		while(i<m&&j<n){
			if(list1.get(i)<list2.get(j)){
				output.add(list1.get(i));
				i++;
			}else{
				output.add(list2.get(j));
				j++;
			}
		}
		if(i!=m) output.addAll(list1.subList(i, m));
		if(j!=n) output.addAll(list2.subList(j, n));
		return output;
	}
	static List<Integer> mergesort(List<Integer> list){
		int n = list.size();
		if(n<2) return list;
		List<Integer> output1 = mergesort(list.subList(0, n/2)), output2 = mergesort(list.subList(n/2, n));
		List<Integer> output = merge(output1, output2);
		return output;
	}
	static void adjust(List<Integer> tree, int root){
		int n = tree.size(), left = (root+1)*2-1, right = (root+1)*2;
		if(left>n-1) return;
		int swap = left;
		if(right<n-1&&tree.get(left)>tree.get(right)) swap = right;
		if(tree.get(root)>tree.get(swap)){
			int tmp = tree.get(root);
			tree.set(root, tree.get(swap));
			tree.set(swap, tmp);
			adjust(tree, swap);
		}
	}
	static void initTree(List<Integer> tree){
		int n = tree.size(), last = (n-2)/2;
		for(int i=last; i>=0; i--) adjust(tree, i);
	}
	static List<Integer> treesort(List<Integer> tree){
		initTree(tree);
		List<Integer> output = new ArrayList<Integer>();
		while(tree.size()>1){
			output.add(tree.get(0));
			tree.set(0, tree.remove(tree.size()-1));
			adjust(tree, 0);
		}
		output.add(tree.get(0));
		return output;
	}
	public static void main(String [] args){
		List<Integer> A = new ArrayList<Integer>();
		Random random = new Random();
		for(int i=0; i<10000; i++){
			A.add(random.nextInt());
		}
		long old = System.currentTimeMillis();
		popsort(A);
		System.out.println("popsort time = "+(System.currentTimeMillis()-old));


		System.out.println();
		List<Integer> A1 = new ArrayList<Integer>();
		for(int i=0; i<10000; i++){
			A1.add(random.nextInt());
		}
		old = System.currentTimeMillis();
		selectsort(A1);
		System.out.println("selectsort time = "+(System.currentTimeMillis()-old));

		System.out.println();
		List<Integer> A2 = new ArrayList<Integer>();
		for(int i=0; i<10000; i++){
			A2.add(random.nextInt());
		}
		old = System.currentTimeMillis();
		insertsort(A2);
		System.out.println("insertsort time = "+(System.currentTimeMillis()-old));
		
		
		System.out.println();
		List<Integer> A3 = new ArrayList<Integer>();
		for(int i=0; i<10000; i++){
			A3.add(random.nextInt());
		}
		old = System.currentTimeMillis();
		System.out.println("count =" + quicksort(A3, 0, A3.size()-1));
		System.out.println("quicksort time = "+(System.currentTimeMillis()-old));
		
		System.out.println();
		List<Integer> list = new ArrayList<Integer>();
		for(int i=0; i<10000; i++){
			list.add(random.nextInt());
		}
		old = System.currentTimeMillis();
		List<Integer> output = mergesort(list);
		System.out.println("mergesort time = "+(System.currentTimeMillis()-old));
		
		System.out.println();
		List<Integer> tree = new ArrayList<Integer>();
		for(int i=0; i<10000; i++){
			tree.add(random.nextInt());
		}
		old = System.currentTimeMillis();
		List<Integer> output1 = treesort(tree);
		System.out.println("treesort time = "+(System.currentTimeMillis()-old));
		
		
	}

}

执行时间

popsort time = 608

selectsort time = 83

insertsort time = 119

quicksort time = 12

mergesort time = 73

treesort time = 29


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python中常用的排序算法有多种,包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。下面是这些排序算法时间复杂度和简要介绍: 1. 冒泡排序(Bubble Sort): - 时间复杂度:最好情况下O(n),最坏情况下O(n^2),平均情况下O(n^2) - 简介:通过相邻元素的比较和交换来进行排序,每一轮将最大的元素冒泡到最后。 2. 选择排序(Selection Sort): - 时间复杂度:最好情况下O(n^2),最坏情况下O(n^2),平均情况下O(n^2) - 简介:每一轮选择未排序部分的最小元素,并将其放到已排序部分的末尾。 3. 插入排序(Insertion Sort): - 时间复杂度:最好情况下O(n),最坏情况下O(n^2),平均情况下O(n^2) - 简介:将未排序部分的元素逐个插入到已排序部分的合适位置。 4. 快速排序(Quick Sort): - 时间复杂度:最好情况下O(nlogn),最坏情况下O(n^2),平均情况下O(nlogn) - 简介:通过选择一个基准元素,将数组分为两部分,一部分小于基准,一部分大于基准,然后递归地对两部分进行排序。 5. 归并排序(Merge Sort): - 时间复杂度:最好情况下O(nlogn),最坏情况下O(nlogn),平均情况下O(nlogn) - 简介:将数组递归地分成两半,对每一半进行排序,然后将两个有序的子数组合并成一个有序的数组。 需要注意的是,以上时间复杂度是基于比较排序算法的平均情况下的时间复杂度。实际应用中,不同的排序算法在不同的数据集上可能表现出不同的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitsMakeMen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值