C语言 排序算法总结(简单版)

排序算法复杂度表:

种类最优时间复杂度平均时间复杂度最差时间复杂度空间复杂度稳定性
冒泡排序O(N)O(N²)O(N²)O(1)稳定
选择排序O(N)O(N²)O(N²)O(1)不稳定
插入排序O(N)O(N²)O(N²)O(1)稳定
快速排序O(N*log2N)O(N*log2N)O(N2)O(log2n)~O(n) 不稳定
归并排序O(N*log2N) O(N*log2N) O(N*log2N) O(n)稳定
 堆排序O(N*log2N)O(N*log2N)O(N*log2N)O(1)不稳定
希尔排序O(N)O(N)O(N2)O(1)不稳定

1、冒泡排序:比较相邻的两个元素大小。

void bubblesort(int arr[],int len)
{
	int i,j,tmp,flag=0,k;
	if(len<=0||arr==NULL) return ;
	for(i=0;i<len;i++)
	{
		for(j=0;j<len-i-1;j++)
		{
			flag = 0;
			if(arr[j]>arr[j+1])
			{
				flag = 1;
				tmp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = tmp;
			}
		}
		if(flag == 0)
		{
			break;
		}
	}
}

2、选择排序:选择最大(小)值放在后(前)面。

void selectsort(int arr[],int len)
{
    int i,j;
    int tmp;
    int minindex;
    if(len <= 0 || arr == NULL) return ;
    for(i=0;i<len-1;i++)
    {
        minindex = i;
        for(j=i+1;j<len;j++)
        {
            if(arr[minindex] > arr[j])
            {
                minindex = j;
            }
        }
        //put min head;
        tmp = arr[i];
        arr[i] = arr[minindex];
        arr[minindex] = tmp;

    }
}

3、插入排序:将无序数据插入到有序数据。

void insertsort(int arr[],int len)
{
    int i,j;
    int tmp;
    for(i=1;i<len;i++)
    {
        j = i-1;
        tmp = arr[i];
        while(arr[j] > tmp && j >= 0)
        {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = tmp;
    }
}

4、计数排序:数据分配比较密集。

void countsort(int arr[],int len)
{   
    if(len <= 0 || arr == NULL) return ;
    int nmax,nmin;
    int i,j=0;
    nmax = arr[0];
    nmin = arr[0];
    for(i=0;i<len;i++)
    {
        if(arr[i]>nmax)
        {   
            nmax = arr[i];
        }
        if(arr[i]<nmin)
        {   
            nmin = arr[i];
        }
    }
    int *cnt = NULL;
    cnt = (int *)malloc(sizeof(int)*(nmax-nmin+1));
    memset(cnt,0,sizeof(int)*(nmax-nmin+1));
    for(i=0;i<len;i++)
    {   
        cnt[arr[i]-nmin]++;
    }
    for(i=0;i<nmax-nmin+1;i++)
    {
        while(cnt[i] != 0)
        {
            arr[j] = i + nmin;
            j++;
            cnt[i]--;
        }
    }
    free(cnt);
    cnt = NULL;
}

5、快速排序:确定一个标准值,以标准值为界将数据分成两部分,左边小右边大,递归。

int sort(int arr[],int low ,int high)
{   
    int tmp;
    tmp = arr[low];
    while(low < high)
    {
        while(high > low)
        {
            if(arr[high] < tmp)
            {
                arr[low] = arr[high];
                low++;
                break;
            }
            high--;
        }
        while(low < high)
        {
            if(arr[low] > tmp)
            {
                arr[high] = arr[low];
                high--;
                break;
            }
            low++;
        }
    }
    arr[low] = tmp;
    return low;
}
int seg_sort(int arr[],int low,int high)
{
int tmp;
    tmp = arr[high];
    int flag = low -1 ;
    while(low<high)
    {
        if(arr[low] < arr[high])
        {
            if(++flag != low)
            {
                arr[flag] = arr[flag]^arr[low];
                arr[low] = arr[flag]^arr[low];
                arr[flag] = arr[flag]^arr[low];
            }
        }
        low++;
    }
    if(++flag != high)
    {
        arr[flag] = arr[flag]^arr[high];
        arr[high] = arr[flag]^arr[high];
        arr[flag] = arr[flag]^arr[high];
    }
    return flag ;
}
void quicksort(int arr[],int low,int high)
{
    if(arr == NULL || low >= high) return ;
    int nstanderd;
    //nstanderd = sort(arr,low,high);
    nstanderd = seg_sort(arr,low,high);

    quicksort(arr,low,nstanderd-1);
    quicksort(arr,nstanderd+1,high);
}

6、归并排序:

void mergesort(int arr[],int low,int high)
{   
    if(arr == NULL || low >= high) return ;
    //chaifen
    int mid ; 
    mid = low + (high - low)/2;
    
    mergesort(arr,low,mid);
    mergesort(arr,mid+1,high);
    
    //hebin
    merge(arr,low,high);
}
void merge(int arr[],int low,int high)
{
    int begin1;
    int begin2;
    int end1;
    int end2;
    int *ptmp = NULL;
    ptmp = (int *)malloc(sizeof(int)*(high-low+1));
    begin1 = low;
    end1 = low+(high-low)/2;
    begin2 = end1+1;
    end2 = high;

    int i = 0;
    while(begin1 <= end1 && begin2 <= end2)
    {
        if(arr[begin1] < arr[begin2])
        {
            ptmp[i] = arr[begin1];
            i++;
            begin1++;
        }
        else
        {
            ptmp[i] = arr[begin2];
            i++;
            begin2++;
        }
    }
    //rest
    while(begin1 <= end1)
    {
        ptmp[i] = arr[begin1];
        i++;
        begin2++;
    }
    for(i=0;i<high-low+1;i++)
    {
        arr[low+i] = ptmp[i];
    }
    free(ptmp);
    ptmp = NULL;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值