C语言:算法之排序(详细代码)

目录

基本排序

冒泡排序                                                                        

插入排序                                      

选择排序                                                                          

进阶排序 

快速排序

希尔排序

堆排序

其他排序

归并排序


冒泡排序                                                                        

#include <stdio.h>
#include <stdlib.h>
//冒泡排序(从大到小)
void bubbleSort(int arr[],int n){
	int i,j,temp;
	for(i=1;i<n;i++){
		for(j=0;j<n-i;j++){
			if(arr[j]<arr[j+1]){
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
	}
	for(i=0;i<n;i++){
		printf("%d\t",arr[i]);
	}
}

//改进冒泡排序,当一轮排序没有交换任何一个元素,就说明是有序的数列,直接退出循环。
void bubbleSortImprovement(int arr[],int n){
	int i,j,temp;
	int flag=1;
	for(i=1;i<n;i++){
		for(j=0;j<n-i;j++){
			if(arr[j]<arr[j+1]){
				flag=0;
				temp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=temp;
			}
		}
		if(flag==1){
			break;
		}
	}
	for(i=0;i<n;i++){
		printf("%d\t",arr[i]);
	}
}

int main()
{
	int arr[10]={4,2,5,7,3,1,6,9,8,0};
	bubbleSort(arr,10);
	system("pause");
}

插入排序                                      

#include <stdio.h>
#include <stdlib.h>
void insertSort(int arr[],int n){
	int i,j,temp;
	for(i=1;i<n;i++){
		temp=arr[i];
		j=i-1;
		while(j>=0 && arr[j]>temp){
			arr[j+1]=arr[j];
			j--;
		}
		arr[j+1]=temp;
	}
	for(i=0;i<n;i++){
		printf("%d\t",arr[i]);
	}
}
int main()
{
	int arr[10]={2,5,4,6,1,3,9,7,8,0};
	insertSort(arr,10);
	system("pause");
}

选择排序                                                                          

//每一轮遍历在未排序序列中找到最小(大)元素,与已排序序列的末尾元素调换位置;
void selectSort(int arr[],int n){
	int i,j,min,temp;
	for(i=0;i<n-1;i++){
		min=i;
		for(j=i;j<n;j++){
			if(arr[j]<arr[min]){
				min=j;
			}
		}
		temp=arr[i];
		arr[i]=arr[min];
		arr[min]=temp;
	}

	for(i=0;i<n;i++){
		printf("%d\t",arr[i]);
	}
}

//改进选择排序
//我们在每次遍历的时候找出最小值还有最大值,分别与左右已排序序列的末尾元素调换位置。
void swap(int * a,int * b){
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
void selectSort1(int arr[],int n){
	int min,max,z;
	int left=0;
	int right=n-1;
	while(left<right){
		min=left;
		max=right;
		for(z=left;z<=right;z++){
			if(arr[z]<arr[min]){
				min=z;
			}
			if(arr[z]>arr[max]){
				max=z;
			}
		}
		swap(&arr[max],&arr[right]);
		if(min==right){
			min=max;
		}
		swap(&arr[min],&arr[left]);
		left++;
		right--;
	}

	for(z=0;z<n;z++){
		printf("%d\t",arr[z]);
	}
}
int main()
{
	int arr[10]={2,5,4,6,1,3,9,7,8,0};
	selectSort1(arr,10);
	system("pause");
}

快速排序​​​​​​​

#include<stdio.h>
#include<stdlib.h>
void quickSort(int arr[],int left,int right){
        int l=left;
        int r=right;
        int base=arr[l];
        if(l>=r){
                return;
        }
		while(l<r){
			while(l<r){
				if(arr[r]>=base){
					r--;
				}else{
					arr[l]=arr[r];
					break;
				}
			}
			while(l<r){
				if(arr[l]<=base){
					l++;
				}else{
					arr[r]=arr[l];
					break;
				}
			}
		} 
        arr[l]=base;
        quickSort(arr,left,l-1);
        quickSort(arr,r+1,right);
}

void main(){
        int i;
        int arr[10]={34,5,6,22,56,88,11,2,4,0};
        quickSort(arr,0,9);
        for(i=0;i<10;i++){
                printf("%d\t",arr[i]);

        }
        system("pause");
}

希尔排序

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

void shellSort(int arr[], int len){
	int gap;//步长
	int i,j,k;
	int temp;
	for(gap=len/2;gap>0;gap=gap/2){//步长分别为5,2,1
		for(i=0;i<gap;i++){//每个小组的第一个元素
			for(j=i+gap;j<len;j=j+gap){//插入排序,将待排序的元素拿出来,使其前面大于此元素的都向后移一位,然后在比他小的元素后面插入此元素
				temp=arr[j];
				k=j-gap;
				while(k>=0 && arr[k]>temp){
					arr[k+gap]=arr[k];
					k=k-gap;
				}
				arr[k+gap]=temp;
			}
		}
	}
}

void main()
{
    int i;
	int arr[10]={9,0,6,7,8,5,4,3,2,1};
    shellSort(arr, 10); 
    for (i = 0; i < 10; i++) { 
        printf("%d\t",arr[i]);
    }
    printf("\n");
	system("pause");
}

堆排序

#include<stdio.h>
#include<stdlib.h>
void adjustHeapSort(int a[],int root, int last)
{
	int child;
	int temp;
	while(2*root+1<=last){
		child=2*root+1;
		if(child+1<=last && a[child]<a[child+1]){
			child++;
		}
		if(a[child]>a[root]){
			temp=a[child];
			a[child]=a[root];
			a[root]=temp;
		}
		root=child;
	}
} 

void swap(int *a,int *b){
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}
void heap_sort(int a[], int len)
{
	int i;
	//第一个循环:构建一个大顶堆
	for(i=len/2-1;i>=0;i--){
		adjustHeapSort(a,i,len-1);
	}
	//第二个循环:将堆顶的元素和最后一个元素对换,调整大顶堆,一次循环
	for(i=len-1;i>0;i--){
		swap(&a[0],&a[i]);
		adjustHeapSort(a,0,i-1);
	}
}
void main()
{
	int i;
    int a[10] = {4,3,1,2,6,5,0,9,8,7};
    heap_sort(a, 10);
    for(i=0; i<10; i++){
		printf("%d ", a[i]);
    } 
    system("pause");
}

归并排序

void merge(int arr[],int tempArr[],int left,int mid,int right){
	//标记左半区第一个未排序的元素
	int l_pos=left;
	//标记右半区第一个未排序的元素
	int r_pos=mid+1;
	//临时数组元素的下标
	int pos=left;
	//合并
	while(l_pos<=mid && r_pos<=right){
		if(arr[l_pos]<arr[r_pos]){
			tempArr[pos++]=arr[l_pos++];
		}else{
			tempArr[pos++]=arr[r_pos++];
		}
	}
	//合并左半区剩余的元素
	while(l_pos<=mid){
		tempArr[pos++]=arr[l_pos++];
	}
	//合并右半区剩余的元素
	while(r_pos<=right){
		tempArr[pos++]=arr[r_pos++];
	}
	//把临时数组中合并后的元素复制回原来的数组
	while(left<=right){
		arr[left]=tempArr[left];
		left++;
	}
}

void msort(int arr[],int * tempArr,int left, int right)
{
	//如果只有一个元素,那么不用划分;只需要被归并
	if(left<right){
		int mid=(left+right)/2;
		//递归划分左半区
		msort(arr,tempArr,left,mid);
		//递归划分右半区
		msort(arr,tempArr,mid+1,right);
		//合并已经排序的部分
		merge(arr,tempArr,left,mid,right);
	}
} 

void mergeSort(int arr[], int len)
{
	//分配一个辅助数组
	int * tempArr=(int *)malloc(len*sizeof(int));
	if(tempArr!=NULL){
		msort(arr,tempArr,0,len-1);
		free(tempArr);
	}else{
		printf("空间分配失败!");
	}
}
void main()
{
	int i;
    int arr[10] = {4,3,1,2,6,5,0,9,8,7};
    mergeSort(arr, 10);
    for(i=0; i<10; i++){
		printf("%d ", arr[i]);
    } 
    system("pause");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值