四大经典排序算法(C语言实现)

一、基数排序

#ifndef sort__h
#define sort__h

#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;


void print_array(int *arr, int n);
// 打印数组

int* sort_array(int *arr, int n);
// 对数组排序,返回排序后的数组


#endif /* sort__h */
void print_array(int *arr, int n)
// 打印数组
{
    if(n==0){
        printf("ERROR: Array length is ZERO\n");
        return;
    }
    printf("%d", arr[0]);
    for (int i=1; i<n; i++) {
        printf(" %d", arr[i]);
    }
    printf("\n");
}


int* sort_array(int *arr, int n)
//  编程实现《基数排序算法》
//  函数参数:乱序整数数组 数组长度
//  函数返回值:返回从小到大排序后的数组
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
int a[10][n]={0};
int b[n]={0};    
int i,j,k; 
int c;
int d;
c=1;	
while(c<= 100)
{
	for(i=0;i<n;i++)
	{
		k = (arr[i]/c) % 10;
		a[k][b[k]] = arr[i];
		b[k]++;
	}	
	d=0; 
	for(i=0;i<n;i++)
	{
		if(b[i] != 0)
		{
			for(j=0;j<b[i];j++)
			{
				arr[d] =a[i][j];
				d++;
			}
		b[i] = 0;
		}
	}	
	c *= 10;
 
}	
return arr;
    /********** End **********/
}
//测试函数功能
int main(int argc, const char * argv[]) {
    // insert code here...
    // std::cout << "Hello, World!\n";

    int n;
    scanf("%d", &n);
    
    int *arr;
    arr = (int*)malloc(sizeof(int)*n);
    
    for (int i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    
    arr = sort_array(arr, n);
    
    print_array(arr, n);
    
    return 0;
}

二、桶排序

#ifndef sort__h
#define sort__h

#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;


void print_array(int *arr, int n);
// 打印数组

int* sort_array(int *arr, int n);
// 对数组排序,返回排序后的数组


#endif /* sort__h */
void print_array(int *arr, int n)
// 打印数组
{
    if(n==0){
        printf("ERROR: Array length is ZERO\n");
        return;
    }
    printf("%d", arr[0]);
    for (int i=1; i<n; i++) {
        printf(" %d", arr[i]);
    }
    printf("\n");
}


int* sort_array(int *arr, int n)
//  编程实现《桶排序算法》
//  函数参数:乱序整数数组 数组长度
//  函数返回值:返回从小到大排序后的数组
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int max = arr[0];
    for(int i = 1; i < n; i++)  
    {
    if(arr[i] > max)
        max = arr[i];
}
int a = max + 1;
int *b=(int *)malloc(sizeof(int)*a);  
int i, j;
for( i = 0; i < a; i++)  
    b[i] = 0;
for(i = 0; i < n; i++)  
    b[ arr[i] ]++;
for(i = 0, j = 0; i < a; i ++)
{
    while( b[ i ] != 0) 
    {
        arr[j ] = i;  
        j++;
        b[i]--;
    }
}
return arr;

        /********** End **********/
}
//测试函数功能
int main(int argc, const char * argv[]) {
    // insert code here...
    // std::cout << "Hello, World!\n";

    int n;
    scanf("%d", &n);
    
    int *arr;
    arr = (int*)malloc(sizeof(int)*n);
    
    for (int i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    
    arr = sort_array(arr, n);
    
    print_array(arr, n);
    
    return 0;
}

三、计数排序

#ifndef sort__h
#define sort__h

#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;

void print_array(int *arr, int n);
// 打印数组

void sort_array(int *arr, int n);
// 对数组排序,返回排序后的数组


#endif /* sort__h */
void print_array(int *arr, int n)
// 打印数组
{
    if(n==0){
        printf("ERROR: Array length is ZERO\n");
        return;
    }
    printf("%d", arr[0]);
    for (int i=1; i<n;i++)  {
        printf(" %d", arr[i]);
    }
    printf("\n");
}
void sort_array(int *a, int n)
//  编程实现《计数排序算法》
//  函数参数:乱序整数数组 数组长度
//  要求输出:调用print_array(int *arr, int n)输出:
//  每一行一个元素及其个数(升序),如 1 1
//  以及最终的升序序列
{
     //请在这里补充代码,完成本关任务
    //********** Begin *****
    int max;
    int j;
    int num=0;
    int k=0;
    for(int i=0;i<n;i++){
        if(max<a[i]){
            max=a[i];
        }
    }
    
    
    
    int *b=(int *)malloc(sizeof(int)*(max+1));
    for(int i=0;i<max;i++){
        b[i]=0;
    }
    for(int i=0;i<n;i++){
        k=a[i];
        b[k]++;
    }
    for(int m=0;m<=max;m++){
        if(b[m]!=0){
            printf("%d %d",m,b[m]);
            printf("\n");
        }
    }
    for(int i=0;i<=max;i++){
        if(b[i]!=0)
        num=num+b[i];
    }
    int *c=(int *)malloc(sizeof(int)*num);
    for(int d=0;d<=max;d++){
        if(b[d]!=0){
            for(int l=0;l<b[d];l++){
                c[j]=d;
                j++;
            }
        }
    }
    print_array(c,num);
    /********** End **********/
}
int main(int argc, const char * argv[]) {
    // insert code here...
    // std::cout << "Hello, World!\n";

    int n;
    scanf("%d", &n);
    
    int *arr;
    arr = (int*)malloc(sizeof(int)*n);
    
    for (int i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    
    sort_array(arr, n);
    
    
    return 0;
}

四、堆排序

#ifndef sort__h
#define sort__h

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;

void print_array(int *arr, int n);
// 打印数组

void adjustHeap(int *arr, int param1, int j);
// 调整堆

int* heap_sort(int *arr, int n);
// 堆排序:自上而下的递归方法,数组个数n

#endif /* sort__h */
void print_array(int *arr, int n)
// 打印数组
{
    if(n==0){
        printf("ERROR: Array length is ZERO\n");
        return;
    }
    printf("%d", arr[0]);
    for (int i=1; i<n; i++) {
        printf(" %d", arr[i]);
    }
    printf("\n");
}

void adjustHeap(int *a, int n, int h)
// 编程实现堆的调整
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int i,j,flag;
    int temp;
    i=h;
    j=2*i+1;
    temp=a[i];
    flag=0;
    while(j<n&&flag!=1){
        if(j<n-1&&a[j]<a[j+1])j++;
        if(temp>a[j])
        flag=1;
        else{
            a[i]=a[j];
            i=j;
            j=2*i+1;
        }
    }
    a[i]=temp;
    
        /********** End **********/
}

int* heap_sort(int *a, int n)
//  基于adjustHeap函数编程实现堆排序
//  函数参数:无序数组arr 数组长度n
//  函数返回值:返回从小到大排序后的数组
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int i;
    int temp;
    int j;
    for(j=(n-2)/2;j>=0;j--)
    adjustHeap(a,n,j);
    for(i=n-1;i>0;i--){
        temp=a[0];
        a[0]=a[i];
        a[i]=temp;
        adjustHeap(a,i,0);
    }
    return a;
    /********** End **********/
}
int main(int argc, const char * argv[]) {
    // insert code here...
    // std::cout << "Hello, World!\n";

    int n;
    scanf("%d", &n);
    
    int *arr;
    arr = (int*)malloc(sizeof(int)*n);
    
    for (int i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    
    arr = heap_sort(arr, n);
    
    print_array(arr, n);
    
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈焰星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值