各种排序算法

今天总结一下各种排序算法:

N=10000的int数组.


1    插入排序

void insert_sort(int data[], int n)
{
	for(int i = 1; i < n; ++i)
	{
		int key = data[i];
	    int j = i-1;
		while( j >= 0 && data[j] > key )
		{
			data[j+1] = data[j];
			--j;
		}
		data[j+1] = key;
	}
}
耗时:0.054s


2    冒泡排序

void bubble_sort(int data[], int n)
{
	for(int i = 0; i < n-1; ++i)
	{
		for(int j = 0; j < n-1-i; ++j)
		{
			if(data[j] > data[j+1]) swap(data[j], data[j+1]);
		}
	}
}
耗时:2.183s


3  选择排序

void select_sort(int data[], int n)
{
    for(int i = 0; i < n-1; ++i)
	{
		for(int j = i+1; j < n; ++j)
		{
			if(data[i] > data[j]) swap(data[i], data[j]);
		}
	}
}
耗时:2.025s


4  堆排序

void heapify(int data[], int n, int i)
{
	int l = 2*i + 1;
	int r = 2*i + 2;
	int maxid = i;

	if(l < n && data[l] > data[i]) maxid = l;

	if(r < n && data[r] > data[maxid]) maxid = r;

	if(maxid != i)
	{
		swap(data[i], data[maxid]);
		heapify(data, n, maxid);
	}
}

void build_heap(int data[], int n)
{
	for(int i = n/2-1; i >= 0; --i)
	    heapify(data, n, i);
}

void heap_sort(int data[], int n)
{
	build_heap(data, n);

	for(int i = n-1; i >= 1; --i)
	{
		swap(data[0], data[i]);
		heapify(data, i, 0);
	}
}
耗时:0.013s


5    归并排序

void merge(int a[], int lena, int b[], int lenb)
{
	int *res = new int[lena + lenb];

	int i = 0, j = 0, k = 0;

	while(i < lena && j < lenb)
	{
		if(a[i] <= b[j]) res[k++] = a[i++];
		else res[k++] = b[j++];
	}
	while(i < lena) res[k++] = a[i++];
	while(j < lenb) res[k++] = b[j++];

	for(int i = 0; i < lena+lenb; ++i)
		a[i] = res[i];

	delete []res;
}

void merge_sort(int A[],int n)
{
    if(n > 1)
	{
		int mid = n/2;

		merge_sort(A, mid);
		merge_sort(A+mid, n-mid);
		merge(A, mid, A+mid, n-mid);
	}
}
耗时:0.005s not in place


6    快速排序

//quick sort
int partition(int A[], int begin, int end)
{
	int x = A[end];
	int i = begin;
	for(int j = begin; j <= end-1; ++j)
	{
		if(A[j] <= x) swap(A[i++], A[j]);
	}
	swap(A[i], A[end]);

	return i;
}

void quick_sort(int A[], int begin, int end)
{
	if(begin < end)
	{
		int q = partition(A, begin, end);
		quick_sort(A, begin, q-1);
		quick_sort(A, q+1, end);
	}
}
耗时:0.008s in place






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值