一个比sort更快的排序

一个比sort更快的排序,一百万个数只需要27ms

在这里插入图片描述

非常消耗内存

#include<stdio.h>
#include<stdlib.h>
void SuperSort(int a[],int l){//a是数组头指针,l是数据最大值 
	int i,j,k;
	char *p=(char*)calloc(l,1);
	for(i=0;a[i]!=0;i++){
		p[a[i]]++;
	}
	for(k=0,j=0;j<i;){
		if(p[k]==0){
			k++;
		}else{
			p[k]--;
			a[j++]=k;
		}
	}
}

int a[20];//举个例子,比如排序20个数(一定要是全局变量哦)
int main(){
	for(int i=0;i<20;i++)
	{
		a[i]=rand()%500000+1;//记住数值不能为0,也就是本算法不能排序0的数
	}
	SuperSort(a,500000);//数组的最大值不超过50万,所以第二个参数就填50万
	//然后a数组就排序完成了
	for(int i=0;i<20;i++)
	{	
		printf("%d ",a[i]);//然后输出他
	}
}
在C++中,如果你追求更高的性能并且确实需要对大量数据进行排序,有几种替代 `std::sort` 的选择,虽然它们不一定总是比 `std::sort` 快,但在某些特定场景下可能会有所提升: 1. **插入排序(Insertion Sort)**:对于小数组或者基本有序的数据,插入排序可能比 `std::sort` 更快。因为它的时间复杂度在最好、最坏情况下都是O(n^2),但对于近乎有序的数据,它的效率接近 O(n)。 ```cpp template<typename T> void insertion_sort(T arr[], int n) { for (int i = 1; i < n; ++i) { T key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } ``` 2. **堆排序(Heap Sort)**:堆排序在大数据量下表现较好,平均时间复杂度为 O(n log n),而且它是原地排序(即不需要额外空间),适用于内存受限的情况。 ```cpp void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) largest = left; if (right < n && arr[right] > arr[largest]) largest = right; if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } } void heapSort(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); for (int i = n - 1; i >= 0; i--) { swap(arr, arr[i]); heapify(arr, i, 0); } } ``` 3. **基数排序(Radix Sort)**:对于非整数数据或者数字位数较少的情况,基数排序可以达到线性时间复杂度,但它需要额外的辅助空间。 需要注意的是,每种排序方法都有其适用范围,实际选择哪种取决于具体的场景和需求。在大多数普通用途中,`std::sort` 已经足够高效,只有在性能瓶颈明显的前提下,才考虑这些替代方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值