5种深层次的排序

1.堆排序
//调整为大栈堆
void reheap(int arr[],size_t n,size_t index){
int key=arr[index];
int child=2index+1;
while(child<n){
if(child+1<n && arr[child+1]>arr[child]){
++child;
}
if(arr[child]>key){
arr[index]=arr[child];
index=child;
child=2
index+1;
}
}
arr[index]=key;
}
void swap(int *pa,int *pb){
int t=*pa;
*pa=*pb;
*pb=t;
}
void heap_sort(int arr[],size_t n){
int i,j;
for(i=n/2-1;i>=0;–i){
reheap(arr,n,i);
}
for(j=n-1;j>0;–j){
swap(&arr[0],&arr[i]);
reheap(arr,i,0);
}
}
2.归并排序
void merer_arr(int arr[],int left,int right){
int mid=(left+right)/2;
int size=mid-left+1; //前size个有序数
int *brr=calloc(size,sizeof(int));
int i;
for(i=0;i<size;i++){ //把前size个有序数写入到brr中
brr[i]=arr[left+i];
}
int j,k;
i=left,j=0,k=mid+1;
while(j<size && k<=right){ //写入到arr中
if(brr[j]<arr[k]){
arr[i++]=brr[j++];
}else{
arr[i++]=arr[k++];
}
}
while(j<size){
arr[i++]=brr[j++];
}
}
void merger(int arr[],int left,int right){
if(left>=right){
return;
}
int mid=(left+right)/2;
merger(arr,left,mid); //使[left,mid]区间的数有序
merger(arr,mid+1,right); //使[mid+1,right]区间的数有序
merger_arr(arr,left,right);
}
void merger_sort(int arr[],size_t n){
merger(arr,0,n-1);
}
3.计数排序
void count_sort(int arr[],size_t n){
int max=arr[0];
int min=arr[0];
int i=0;
for(i=0;i<n;i++){ //找出最大和最小值
if(max<arr[i]){
max=arr[i];
}
if(min>arr[i]){
min=arr[i];
}
}
int len=max-min+1; //最大和最小值间相差的个数
int brr[len];
for(i=0;i<len;i++){
brr[i]=0;
}
for(i=0;i<n;i++){
brr[arr[i]-min]++; //记录arr[i]值的个数
}
int j=0;
for(i=0;i<len;i++){
while(brr[i]>0){
arr[j++]=min+i;
–brr[i];
}
}
}
4.快速排序
void quike(int arr[],int left,int right){
if(left>=right){
return;
}
int key=arr[left];
int i=left,j=right;
while(i<j){
while(i<j && arr[j]>=key){
–j;
}
arr[i]=arr[j];
while(i<j && arr[i]<=key){
++i;
}
arr[j]=arr[i];
}
arr[i]=key;
quike(arr,left,i-1);
quike(arr,i+1,right);
}
void quike_sort(int arr[],size_t n){
quike(arr,0,n-1);
}
5.基数排序
int count_of_num(int num){ //求num的位数
int cnt=0;
do{
++cnt;
num=num/10;
}while(num!=0);
return cnt;
}
int bit_of_num(int num,int bit){ //求num第bit位的数是多少
int i;
for(i=1;i<bit && num!=0;i++){
num=num/10;
}
return num%10;
}
void base_sort(int arr[],size_t n){ //排序需要用10个链表作为容器
int max=arr[0];
int i;
for(i=1;i<n;i++){ //得出最大值
if(max<arr[i]){
max=arr[i];
}
}
int cnt=count_of_num(max); //求出最大值的位数
SLink vect[10]={};
for(i=0;i<10;i++){
vect[i]=slink_create(); //创建10个链表
}
int bit;
for(bit=1;bit<=cnt;bit++){
for(i=0;i<n;i++){
int n=bit_of_num(arr[i],bit); //得到arr[i]的bit位的值
slink_push_back(vect[n],arr[i]); //把arr[i]放到对应的容器中
}
int j=0;
for(i=0;i<10;i++){
while(!slink_is_empty(vect[i])){
int n=slink_get_front(vect[i]); //按顺序从10个链表中拿出数值,放入arr[j]中
arr[j++]=n;
slink_pop_front(vect[i]);
}
}
}
for(i=0;i<10;i++){
slink_destroy(vect[i]);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`groupby` 是 pandas 中非常有用的函数,它可以将数据按照某些标准进行分组,并对每个分组进行操作。除了基本的分组操作之外,`groupby` 也支持一些层次的运用,下面介绍一下其中的几个。 1. 聚合多个函数 `groupby` 可以使用 `agg` 方法聚合多个函数。例如,我们可以对一个数据集按照性别进行分组,然后计算每个分组的平均年龄和身高: ```python import pandas as pd data = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Ella', 'Frank'], 'gender': ['F', 'M', 'M', 'M', 'F', 'M'], 'age': [25, 30, 35, 40, 45, 50], 'height': [165, 170, 175, 180, 165, 175] }) grouped = data.groupby('gender').agg({'age': 'mean', 'height': 'mean'}) print(grouped) ``` 输出结果: ``` age height gender F 35.000000 165.0 M 38.333333 175.0 ``` 2. 对分组后的数据进行排序 `groupby` 后的数据可以使用 `sort_values` 方法排序。例如,我们可以对一个数据集按照性别进行分组,然后按照年龄和身高进行排序: ```python import pandas as pd data = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Ella', 'Frank'], 'gender': ['F', 'M', 'M', 'M', 'F', 'M'], 'age': [25, 30, 35, 40, 45, 50], 'height': [165, 170, 175, 180, 165, 175] }) grouped = data.groupby('gender').apply(lambda x: x.sort_values(['age', 'height'])) print(grouped) ``` 输出结果: ``` name gender age height gender F 0 Alice F 25 165 4 Ella F 45 165 M 1 Bob M 30 170 2 Charlie M 35 175 3 David M 40 180 5 Frank M 50 175 ``` 3. 使用 `transform` 方法进行数据变换 `groupby` 后的数据可以使用 `transform` 方法进行数据变换。例如,我们可以对一个数据集按照性别进行分组,然后计算每个分组的平均年龄和身高,并将每个人的年龄减去对应分组的平均年龄: ```python import pandas as pd data = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Ella', 'Frank'], 'gender': ['F', 'M', 'M', 'M', 'F', 'M'], 'age': [25, 30, 35, 40, 45, 50], 'height': [165, 170, 175, 180, 165, 175] }) grouped = data.groupby('gender').agg({'age': 'mean', 'height': 'mean'}) data['age_diff'] = data['age'] - data['gender'].map(grouped['age']) print(data) ``` 输出结果: ``` name gender age height age_diff 0 Alice F 25 165 -10.0 1 Bob M 30 170 -8.333333 2 Charlie M 35 175 -3.333333 3 David M 40 180 1.666667 4 Ella F 45 165 10.000000 5 Frank M 50 175 8.333333 ``` 4. 按照多个键进行分组 `groupby` 可以按照多个键进行分组。例如,我们可以对一个数据集按照性别和身高进行分组,然后计算每个分组的平均年龄: ```python import pandas as pd data = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie', 'David', 'Ella', 'Frank'], 'gender': ['F', 'M', 'M', 'M', 'F', 'M'], 'age': [25, 30, 35, 40, 45, 50], 'height': [165, 170, 175, 180, 165, 175] }) grouped = data.groupby(['gender', 'height']).agg({'age': 'mean'}) print(grouped) ``` 输出结果: ``` age gender height F 165 25 M 170 30 175 42.5 180 40 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值