整理的常用的9种排序算法 c语言 复杂度表



#include <stdio.h>


#define Max_ 10      //数组个数

#define RADIX_10 10    //整形排序

#define KEYNUM_31 10     //关键字个数,这里为整形位数

void swap(int *a, int *b)

{

    int temp;

    temp = *a;

    *a = *b;

    *b = temp;

}

// 快速排序


void quick_sort(int s[], int l, int r)

{

    if (l < r)

    {

        //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1

        int i = l, j = r, x = s[l];

        while (i < j)

        {

            while(i < j && s[j] >= x)  j--;// 从右向左找第一个小于x的数

            

            if(i < j)

                s[i++] = s[j];

            

            while(i < j && s[i] < x)   i++; // 从左向右找第一个大于等于x的数


            if(i < j)

                s[j--] = s[i];

        }

        s[i] = x;

        quick_sort(s, l, i - 1); // 递归调用

        quick_sort(s, i + 1, r);

    }

}


// 冒泡排序


void maopao_sort(int array[],int length){

    for (int i = 0; i < length; i++)

    {

        //每一次由底至上地上升

        for (int j = 0; j < length-i; j++)

        {

            if (array[j] < array[j-1])

            {

                swap(&array[j], &array[j-1]);

            }

        }

    }

}


// 插入排序

void insert_sort(int a[], int len)

{

    int start = 1;//index = 0 的默认排好了的。

    

    //i代表初始吭位置 - 趟数

    for(int i = start; i<len; i++){//设定数组的第一个元素是排序好的

        int j = i;

        int key = a[i];//s[i]赋给中间变量,相当于把s[i]挖空,等找到合适的元素再把元素插入这个位置

        

        while(j > 0 && a[j-1] > key){// r如果元素比中间值大,则移动位置

            a[j] = a[j-1];

            j--;//不断和排好序的元素比较, 此时的坑index

        }

        

        a[j] = key;//每次循环后把坑填好

    }

}


//希尔,shell 排序

void shell_sort(int a[], int n)

{

    int i, j, gap;

    

    for (gap = n / 2; gap > 0; gap /= 2) //步长

        for (i = 0; i < gap; i++)        //直接插入排序

        {

            for (j = i + gap; j < n; j += gap)

                if (a[j] < a[j - gap])

                {

                    int temp = a[j];

                    int k = j - gap;

                    while (k >= 0 && a[k] > temp)

                    {

                        a[k + gap] = a[k];

                        k -= gap;

                    }

                    a[k + gap] = temp;

                }

        }

}






void Merge(int array[] , int low , int mid , int high)

{

    int i , j , k;

    int *temp = (int *)malloc((high - low + 1)*sizeof(int));

    i = low , j = mid + 1 , k = 0;

    while(i <= mid && j <= high)

    {

        if(array[i] < array[j])        // 进行排序存入动态分配的数组中

            temp[k++] = array[i++];

        else

            temp[k++] = array[j++];

    }

    while(i <= mid)                    // 如果前一半中还有未处理完的数据,按顺序移入动态分配的数组内

        temp[k++] = array[i++];

    while(j <= high)                   // 如果前一半中还有未处理完的数据,按顺序移入动态分配的数组内

        temp[k++] = array[j++];

    for(i = low , j = 0; i<= high ; ++i)

        array[i] = temp[j++];

    

}

//归并排序


void Msort(int array[] , int low , int high)

{

    int mid;

    if(low < high)

    {

        mid = (low + high)>>1;

        Msort(array , low , mid);

        Msort(array , mid + 1 , high);

        Merge(array , low , mid , high);

    }

}




// 堆排序

void HeapAjust(int data[],int i,int length)

{

    int nChild;

    int nTemp;

    for(nTemp=data[i];2*i+1<length;i=nChild)

    {

        nChild=2*i+1;

        if(nChild<length-1&&data[nChild+1]>data[nChild])//比较哪个孩子比自己大,如果是右孩子的话,就要将nChild++

        {

            nChild++;

        }

        

        if(nTemp<data[nChild])//如果比自己的最大的孩子小,就交换

        {

            data[i]=data[nChild];

            data[nChild]=nTemp;

        }

        else//如果比最大的孩子还大,就不交换

            break;

    }

}


//堆排序

void HeapSort(int data[],int length)

{

    for(int i=(length>>1)-1;i>=0;i--)//注意这个地方:i=(length>>1)-1,加上括号,原因:优先级的问题

    {

        HeapAjust(data,i,length);//初始化一个堆

    }

    for(int j=length-1;j>0;--j)

    {

        int temp=data[j];

        data[j]=data[0];

        data[0]=temp;

        HeapAjust(data,0,j);

    }

}

//直接选择

void select_sort(int a[], int n) {

    for(int i=0; i < n-1; i++) {

        int j = i;

        int min = a[j];

        for(int k=i; k < n; k++) {

            if (a[k] < min) {

                j = k;

                min = a[k];

            }

        }

        int t = a[i];

        a[i] = a[j];

        a[j] = t;

    }

}


//基数排序


int GetNumInPos(int num,int pos)

{

    int temp = 1;

    for (int i = 0; i < pos - 1; i++)

        temp *= 10;

    

    return (num / temp) % 10;

}



//基数排序  pDataArray 无序数组;iDataNum为无序数据个数

void RadixSort(int* pDataArray, int iDataNum)

{

    int *radixArrays[RADIX_10];    //分别为0~9的序列空间

    for (int i = 0; i < 10; i++)

    {

        radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));

        radixArrays[i][0] = 0;    //index0处记录这组数据的个数

    }

    

    for (int pos = 1; pos <= KEYNUM_31; pos++)    //从个位开始到31

    {

        for (int i = 0; i < iDataNum; i++)    //分配过程

        {

            int num = GetNumInPos(pDataArray[i], pos);

            int index = ++radixArrays[num][0];

            radixArrays[num][index] = pDataArray[i];

        }

        

        for (int i = 0, j =0; i < RADIX_10; i++)    //收集

        {

            for (int k = 1; k <= radixArrays[i][0]; k++)

                pDataArray[j++] = radixArrays[i][k];

            radixArrays[i][0] = 0;    //复位

        }

    }

}



int main(int argc, const char * argv[]) {

    // insert code here...

    int arr_test[Max_] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };


   // RadixSort( arr_test, Max_);

 

    

 

   

    for(int i=0;i<Max_;i++){

        printf("%d-",arr_test[i]);

    }

    return 0;

}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值