运用各种排序算法完成数组数据的排序

运用各种排序算法完成数组数据的排序(插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序对元素进行排序)

一、明确问题

实验目的:掌握各种排序算法
实验内容:
运用插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序对元素进行排序。关键码序列(503,087,512,061,908,170,897,275,653,426)

二、问题分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、主要函数和伪代码

以下为本次实验所使用的子函数:(代码中包含直接插入排序、快速排序、希尔排序、简单选择排序、堆排序、归并排序、基数排序七种)具体代码参考第四大点。
void insertsort(int a[])
int Partition(int a[],int low,int high)
void Qsort(int a[],int low,int high)
void creat(int a[],int *s)
void shellSort(int *a, int n)
void print(int a[])
void SelectSort(int a[])
void swap(int *arr,int i,int j)
void heapify(int *s,int n,int i)
void build_heap(int *s,int n)
void heap_sort(int *s, int n)
void merge(int a[],int l,int r,int mid)
void merge_sort(int a[],int l,int r)
void mergesort(int a[],int l,int r)
int get_max(int a[], int n)
void count_sort(int a[], int n, int exp)
void radix_sort(int a[], int n)

四、源代码和运行结果

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>

void insertsort(int a[]){
	int S[11];
	int i,j;
	for(i=1;i<11;i++)S[i]=a[i-1];
	
	for(i=2;i<=10;i++){
		if(S[i]<S[i-1]){
			S[0]=S[i];
			S[i]=S[i-1];
			for(j=i-2;S[0]<S[j];j--)
			   S[j+1]=S[j];
			S[j+1]=S[0];   
		}
	}
	for(i=1;i<11;i++) printf("%d ",S[i]);
}

int Partition(int a[],int low,int high){
	int pivot;
	int i,j;
	pivot=a[low];i=low;j=high;
	while(i<j){
		while(i<j && a[j]>=pivot) j--;
		a[i]=a[j];
		while(i<j && a[i]<=pivot) i++;
		a[j]=a[i];
	}
	a[i]=pivot;
	return i;
}

void Qsort(int a[],int low,int high){
	int k;
	if(low<high){
		k=Partition(a,low,high);
		Qsort(a,low,k-1);
		Qsort(a,k+1,high);
	}
}

void  creat(int a[],int *s){
	int i;
	for(i=0;i<10;i++) s[i]=a[i];
}

void shellSort(int *a, int n)
{
    int i, j, k, tmp, gap;  // gap 为步长
    for (gap = n / 2; gap > 0; gap /= 2) {  // 步长初始化为数组长度的一半,每次遍历后步长减半,
    	for (i = 0; i < gap; ++i) { // 变量 i 为每次分组的第一个元素下标 
	        for (j = i + gap; j < n; j += gap) { //对步长为gap的元素进行直插排序,当gap为1时,就是直插排序
	            tmp = a[j];  // 备份a[i]的值
	            k = j - gap;  // j初始化为i的前一个元素(与i相差gap长度)
	            while (k >= 0 && a[k] > tmp) {
	                a[k + gap] = a[k]; // 将在a[i]前且比tmp的值大的元素向后移动一位
	                k -= gap;
	            }
	            a[k + gap] = tmp; 
	        }
	    }
    }
}


void print(int a[]){
	int i;
	for(i=0;i<10;i++)printf("%d ",a[i]);
}

void SelectSort(int a[]){
	int i,j,k;
	int tmp;
	for(i=0;i<10;i++){
		k=i;
		for(j=i+1;j<10;j++)
		   if(a[j]<a[k]) k=j;
		if(k!=i){
			tmp=a[i];
			a[i]=a[k];
			a[k]=tmp;
		}
	} 
	print(a);
}

void swap(int *arr,int i,int j){
	int temp=arr[i];
	arr[i]=arr[j];
	arr[j]=temp; 
}

void heapify(int *s,int n,int i){
	int c1=2*i+1;
	int c2=2*i+2;
	int max=i;
	if(c1<n && s[c1]>s[max]){
		max=c1;
	}
	if(c2<n && s[c2]>s[max]){
		max=c2;
	}
	if(max!=i){
		swap(s,max,i);
		heapify(s,n,max);
	}
}

void build_heap(int *s,int n){
	int last_node=n-1;
	int parent=(last_node-1)/2;
	int i;
	for(i=parent;i>=0;i--){
		heapify(s,n,i);
	}
}

void heap_sort(int *s, int n){
	build_heap(s,n);
	int i;
	for(i=n-1;i>=0;i--){
		swap(s,i,0);
		heapify(s,i,0);
	}
} 

void merge(int a[],int l,int r,int mid){  
   int aux[r-l+1],i,j,k;
   for(k=l;k<=r;k++)
   aux[k-l]=a[k];
   i=l; 
   j=mid+1;  
   for(k=l;k<=r;k++) {  
       	if(i>mid){ 
		   	a[k]=aux[j-l];
			j++;	
		}
		else if(j>r){
		    a[k]=aux[i-l];
			i++;
		}
		else if(aux[i-l]>aux[j-l]){
		    a[k]=aux[j-l];
			j++;
		}
		else{
		    a[k]=aux[i-l];
			i++;
		}
	}
} 

void merge_sort(int a[],int l,int r){    
   if(l>=r)
   return ;		
   int mid=(l+r)/2;		
   merge_sort(a,l,mid);	
   merge_sort(a,mid+1,r);	
   merge(a,l,r,mid);
}  

void mergesort(int a[],int l,int r){	
  merge_sort(a,l,r-1);
}


int get_max(int a[], int n)
{
    int i, max;

    max = a[0];
    for (i = 1; i < n; i++)
        if (a[i] > max)
            max = a[i];
    return max;
}

void count_sort(int a[], int n, int exp)
{
    int output[n];             // 存储"被排序数据"的临时数组
    int i, buckets[10] = {0};
    // 将数据出现的次数存储在buckets[]中
    for (i = 0; i < n; i++)
        buckets[ (a[i]/exp)%10 ]++;
    // 更改buckets[i]。目的是让更改后的buckets[i]的值,是该数据在output[]中的位置。
    for (i = 1; i < 10; i++)
        buckets[i] += buckets[i - 1];
    // 将数据存储到临时数组output[]中
    for (i = n - 1; i >= 0; i--)
    {
        output[buckets[ (a[i]/exp)%10 ] - 1] = a[i];
        buckets[ (a[i]/exp)%10 ]--;
    }
    // 将排序好的数据赋值给a[]
    for (i = 0; i < n; i++)
        a[i] = output[i];
}

void radix_sort(int a[], int n)
{
    int exp;    // 指数。当对数组按各位进行排序时,exp=1;按十位进行排序时,exp=10;...
    int max = get_max(a, n);    // 数组a中的最大值

    // 从个位开始,对数组a按"指数"进行排序
    for (exp = 1; max/exp > 0; exp *= 10)
        count_sort(a, n, exp);
}

main(){
	int a[10]={503,87,512,61,908,170,897,275,653,426};
	int s[10];	int n=10;
	
	printf("原数组序列:\n");
	print(a);
	
	printf("\n\n直接插入排序:\n");
	insertsort(a);
	
	printf("\n\n快速排序:\n");
	int low,high;
	low=0;high=9;
	creat(a,s);
	Qsort(s,low,high);
	print(s);
	
	printf("\n\n希尔排序:\n");
	creat(a,s);
	shellSort(s, n);
	print(s);
	
	printf("\n\n简单选择排序:\n");
	creat(a,s);
	SelectSort(s);
	
	printf("\n\n堆排序:\n");
	creat(a,s);
	heap_sort(s,n);
	print(s);
	
	printf("\n\n归并排序:\n");
	creat(a,s);
	mergesort(s,0,n);
	print(s);
	
	printf("\n\n基数排序:\n");
	creat(a,s);
	radix_sort(s, n);
	print(s);
}

在这里插入图片描述

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值