基数排序和分组排序

来源:互联网 发布:淘宝订单数据 编辑:程序博客网 时间:2024/06/10 20:26

我们先来讲一下其他排序的特点:

冒泡排序:

相邻两个数比较获得最大或者最小的数,剩下的再去排序最大最小的,每轮冒出一个数

选择排序:

从所有数中找出一个需要的数和固定位置交换,所有数都选择一次就所有数都有序排列

插入排序:

把第一个元素当成一个有序数组,然后依次把其他元素插入到这个有序数组中

基数排序用到的是数组下标天然有序

使用基数排序的缺点:

1.占用大的内存

2.数组中的元素不能重复

3.只能排序整数

分组排序:

把分组分成两组 l  r

l组小于r组,然后l组分成两组ll  lr  r组分成两组rl   rr,分到每个组只有一个元素为止。

看一下基数排序的代码:

#include <stdio.h>void sort(int* a,int len,int max){int b[max+1];int i;for(i=0;i<max+1;i++){b[i]=-1;}for(i=0;i<len;i++){b[a[i]]=a[i];}for(i=0;i<max+1;i++){if(b[i]!=-1)printf("%d ",b[i]);}printf("\n");}int main(int argc, char const *argv[]){int a[10]={9,7,0,8,6,4,5,3,1,2};sort(a,10,9);return 0;}
分组排序的代码:

#include <stdio.h>void print(int* a,int len){int i;for(i=0;i<len;i++)printf("%d ",a[i]);printf("\n");}void sort(int* a,int len){//排序//1 把整个数组分成两个数组if(len <= 1) return;int l = 0;int r = len-1;int t;while(l<r){while(l<r && a[l]<a[r]) r--;t = a[l];a[l] = a[r];a[r] = t;while(l<r && a[l]<a[r]) l++;t = a[l];a[l] = a[r];a[r] = t;}print(a,len);//2 调用本身对两个数组排序sort(a,l+1);//0-l 排序sort(a+l+1,len-l-1);//l+1 len-1 排序}int main(){int array[10] = {99,7,67,32,4,31,6,53,8,-4};printf("before sort:");print(array,10);sort(array,10);printf("after  sort:");print(array,10);return 0;}