常见排序算法

本文详细介绍了四种经典的排序算法:冒泡排序、选择排序、插入排序和归并排序,均使用C语言实现。这些算法的时间复杂度均为O(n^2),适用于小规模数据的排序。通过实例代码,读者可以深入理解每种排序算法的工作原理及其在实际编程中的应用。
摘要由CSDN通过智能技术生成

常见排序算法(基于C语言的算法设计)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

冒泡排序算法

//冒泡排序时间复杂度O(n^2)
#include<stdio.h>	
void main()
{
	int n[10] = { 25,35,68,79,21,13,98,7,16,62 };//定义一个大小为10的数组
	int i, j, temp;
	for (i = 1; i <= 9; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
	{
		for (j = 0; j <= 9 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
		{
			if (n[j] > n[j + 1])//相邻两个数如果逆序,则交换位置
			{
				temp = n[j];
				n[j] = n[j + 1];
				n[j + 1] = temp;
			}
		}
	}
	printf("排序过后的数顺序:\n");
	for (i = 0; i < 10; i++)
	printf("%-4d", n[i]);
	printf("\n");
}

选择排序

//时间复杂度O(n^2)
#include <stdio.h>
 
void arr_out(int a[8])//输出函数
{
    int i = 0;
    for(i = 0;i < 8;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}
 
void arr_sort(int *p,int n)
{
    int i,j;
    int min = 0;
    for(i = 0;i < n - 1;i++)//排序次数
    {
        min = i;
        for(j = i + 1;j < n;j++)
        {
            if(p[j] < p[min])
            {
                min = j;//记录交换的元素下标值
            }
        }
        if(i != min)
        {
            int temp = p[i];
            p[i] = p[min];
            p[min] = temp;
        }  
    }
}
 
int main()
{
    int a[8] = {0};
    int i = 0;
    for(i = 0;i < 8;i++)
    {
        scanf("%d",&a[i]);
    }
 
    arr_sort(a,8);//排序函数
    arr_out(a);//输出函数
 
    return 0;
}

插入排序

//时间复杂度O(n^2)
#include <stdio.h>
#define n 10
int main()
{
    int a[n],i,j,k,x;
    scanf("%d",&a[0]);//读入第一个数,直接存到a[0]中
    for(j=1;j<n;j++)//将第二个至第10个数一一有序插入到数组a中
    {
        scanf("%d",&x);
        if(x<a[j-1])
            a[j]=x;//比最后一个数还小就往最后一个元素之后存放新读的数
    else//以下查找待查位置(从头开始查)
    {
        i=0;
        while(x<a[i]&&i<=j-1)//条件判断,并且不超范围
          {
            i++;
          }
        for(k=j-1;k>=i;k--)//(包括i)的项到最后一项(k=j-1)后移一位
        {
        a[k+1]=a[k];//后等前,后移
        }
        a[i]=x;//插入待插入数
    }
    }
    for(i=0;i<n;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

归并排序

#include <stdio.h>
#include <stdlib.h>
void Merge(int A[],int left,int mid,int right){
   int B[1024]={0};
   int i=left;
   int j=mid+1;
   int k=0;
   while(i<=mid&&j<=right){
    if(A[i]<A[j]){
        B[k++]=A[i++];
    }else{
        B[k++]=A[j++];
    }
   }
   if(i==mid+1){
    while(j<=right){
        B[k++]=A[j++];
    }
   }
   if(j==right+1){
    while(i<=mid){
        B[k++]=A[j++];
    }

   }
   for(i=left,j=0;j<k;i++,j++){
    A[i]= B[j];
   }
}

void MergeSort(int A[],int left,int right){
    if(left>=right){
        return ;
    }
    int mid = (left+right)/2;
    MergeSort(A,left,mid);
    MergeSort(A,mid+1,right);
    Merge(A,left,mid,right);


}
void outPut(int A[],int right){
    for(int i=0;i<right;i++){
        printf("%d\n",A[i]);
    }
}
int main()
{
    int A[]={7,8,2,10};
    int n = sizeof(A)/sizeof(A[0]);
    MergeSort(A,0,n-1);
    outPut(A,n);
    return 0;
}

快速排序

在这里插入代码片
void Quick_Sort(int *arr, int begin, int end){
    if(begin > end)
        return;
    int tmp = arr[begin];
    int i = begin;
    int j = end;
    while(i != j){
        while(arr[j] >= tmp && j > i)
            j--;
        while(arr[i] <= tmp && j > i)
            i++;
        if(j > i){
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[begin] = arr[i];
    arr[i] = tmp;
    Quick_Sort(arr, begin, i-1);
    Quick_Sort(arr, i+1, end);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值