归并、快速、基数和计数排序

归并排序

void merger_arr(int arr[],int left,int right){
int mid = (left+right)/2;
//arr[left],arr[mid] arr[mid+1] arr[right]
int cnt = mid-left+1;
int *brr = calloc(cnt,sizeof(int));
int i;
for(i=0;i<cnt;i++){
brr[i] = arr[left+i];
}
int j,k;
i=left,j=0,k=mid+1;
while(j<cnt && k<=right){
if(brr[j] < arr[k]){
arr[i++] = brr[j++];
}else{
arr[i++] = arr[k++];
}
}
while(j<cnt){
arr[i++] = brr[j++];
}
free(brr);
}

void merger(int arr[],int left,int right){
//对[left,right]区间进行排序
if(left>=right){//最多有一个元素
return;
}
int mid = (left+right)/2;
merger(arr,left,mid);
merger(arr,mid+1,right);
//[left,mid] 和 [mid+1,right]都是升序
merger_arr(arr,left,right);
}

void merger_sort(int arr[],size_t n){
merger(arr,0,n-1);
}

快速排序

第一种:
void quick_sort2(int arr[],size_t n){
if(n<=1){
return;
}
int pvoit = arr[0];
int i=0,j=n-1;
while(i<j){
while(i<j && arr[j]>=pvoit){
–j;
}
arr[i]=arr[j];
while(i<j && arr[i]<=provit){
++i;
}
arr[j]=arr[i];
}
arr[i]=pvoit;
if(i>1){
quick_sort(arr,i);
}
if(n-i-1>1){
quick_sort(arr+i+1,n-i-1);
}
}
第二种:
void quick(int arr[],int left,int right){
if(left>=right){
return;
}
int pvoit = arr[left];
int i=left,j=right;
while(i<j){
while(i<j && arr[j]>=pvoit){
–j;
}
arr[i] = arr[j];
while(i<j && arr[i]<=pvoit){
++i;
}
arr[j] = arr[i];
}
arr[i] = pvoit;
quick(arr,left,i-1);
quick(arr,i+1,right);
}

void quick_sort(int arr[],size_t n){
quick(arr,0,n-1);
}

计数排序

//适用范围较小的整数
void count_sort(int arr[],size_t n){
int max = arr[0],min = arr[0],i=0;
for(i=1;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[0] min brr[i] i+min
brr[i] = 0;
}
for(i=0;i<n;i++){//arr[i]值记录在 brr[arr[i]-min]
brr[arr[i]-min]++;//记录arr[i]值出现次数
};
int j = 0;
for(i=0;i<len;i++){
while(brr[i]>0){//i+min
arr[j++] = i+min;
–brr[i];
}
}
}

基数排序

int count_of_num(int num){
int cnt = 0;
do{
++cnt;
num = num/10;
}while(num!=0);
return cnt;
}

int num_of_bit(int num,int 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){
int max = arr[0];
int i,j;
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();
}
int bit;
for(bit=1;bit<=cnt;bit++){
for(i=0;i<n;i++){
int n = num_of_bit(arr[i],bit);
slink_push_back(vect[n],arr[i]);
}
j = 0;
for(i=0;i<10;i++){
while(!slink_is_empty(vect[i])){
int n = slink_get_front(vect[i]);
arr[j++] = n;
slink_pop_front(vect[i]);
}
}
}
for(i=0;i<10;i++){
slink_destroy(vect[i]);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值