排序算法原理简述及C语言实现

=============================== 博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
1 冒泡排序
原理简述:冒泡排序,大泡泡在底下,小泡泡在上面,假设递增排序,即小数在前面,大数在后面。每一次比较相邻的两个数,第一个数大于第二个数,就交换顺序,一次比较到数组结尾,最后一个就是最大的数,再一次从头开始比较,比较到倒数第二个数,最后一个数不参与比较,以此一直比较,到没有数据交换为止,此时排序完成。

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

2 插入排序
原理简述:插入排序,插入,即向有序的序列先比较再插入,首先假设数组首元素有序,取出第二个元素,与第一个比较,比第一个元素大,就交换顺序,接着取第三个元素,先与第二个元素,比第二个大,位置不动,比第二个小,第二个元素换到第三个元素的位置,再和第一个比较,比第第一个大,就放到第二个元素位置,比第一个元素小,就将一个元素,放到第二个元素的位置,以此类推。

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

3 选择排序
原理简述:选择排序,即在无序的数组中找个最小的放在第一位,接下来,在剩余的数中,再找一个最小的数,放到第二位,以此类推。

void selectsort(int arr[],int len)
{
    int min;
    int i,j;
    int tmp;
    for(i = 0;i < len;i++)
    {
        min = arr[i];
        for(j = i+1; j < len;j++)
        {
            if(min > arr[j])
            {
                tmp = min;
                min = arr[j];
                arr[j] = tmp;
            }
        }
        arr[i] = min;
    }
}

4 希尔排序
原理简述:希尔排序,实质是分组插入排序,一般情况,假设数据8个元素,先分为(step = n/2)四组,(1,5),(2,6),(3,7),(4,8),组内先比较 ,比较交换后,再分为(step =step /2)两组,(1,3,5,7),(2,4,6,8),组内先比较排序交换,再分为(step =step /2)一组,排序后,就完成排序了,此时step =step/2 = 0。

void shellsort(int arr[],int len)
{
    int step;
    int i,k;
    int tmp;
    for(step = len/2; step > 0; step = step/2)
    {
        for(i = step; i < len;i++)
        {
            if(arr[i - step] > arr[i])
            {
                k = i -step;
                tmp = arr[i];
                while(k>=0 && arr[k] > tmp)
                {
                    arr[k+step] = arr[k];
                    k = k -step;
                }
                arr[k+step] = tmp;
            }
        }
    }
}

5 快速排序
原理简述:快速排序,先选择一个元素(一般首元素或尾元素),假设是首元素,首先取出首元素缓存,首元素位置为空,定义两个变量low,high,low从最小下标递增,high最大下标递减,第一步,看high下标的这个元素,是否大于首元素缓存,大于则high–,继续判断直到不大于则将这个元素放到首元素的位置,此时,high下标的位置为空,比较low下标元素,小于缓存则low++,,继续判断直到不小于则将这个元素放到high下标元素的位置,此时,low下标的位置为空,以此循环,直到low不小于high为止,此时low位置放首元素的缓存,low位置最终就是这个元素排序的位置,然后以low位置为分界线分为两组,再做如上步骤。

void quicksort(int arr[],int left ,int right)
{
    int low,high;
    int key;
    key = arr[left];
    low = left;
    high = right;
    if(left < right)
    {
        while(low < high)
        {
            while((low < high)  && (key <= arr[high]))
            {
            high--;
            }
            arr[low] =arr[high];
            while((low < high)  && (key > arr[low]))
            {
            low++;
            }
            arr[high] = arr[low];
        }
        arr[low] = key;
        quicksort(arr,left,low-1);
        quicksort(arr,low+1,right );
    }
}

6 归并排序
原理简述:归并排序,先递归后合并,一组数分为两组,两组分为四组,四组分为八组,直到每组只有一个元素,此时认为有序,然后逆向合并,两个一个元素合并两个,两个合并四个,直到合并为一个大数组为止。以下代码来自百度百科。

void Merge(int sourceArr[],int tempArr[],int startIndex,int midIndex,int endIndex)
{
    int i = startIndex,j=midIndex+1,k = startIndex;
    while(i!=midIndex+1 && j!=endIndex+1)
    {
        if(sourceArr[i]>sourceArr[j])
            tempArr[k++] = sourceArr[i++];
        else
            tempArr[k++] = sourceArr[j++];
    }
    while(i!=midIndex+1)
        tempArr[k++] = sourceArr[i++];
    while(j!=endIndex+1)
        tempArr[k++] = sourceArr[j++];
    for(i=startIndex;i<=endIndex;i++)
        sourceArr[i] = tempArr[i];
}
void MergeSort(int sourceArr[],int tempArr[],int startIndex,int endIndex)
{
    int midIndex;
    if(startIndex<endIndex)
    {
        midIndex=(startIndex+endIndex)/2;
        MergeSort(sourceArr,tempArr,startIndex,midIndex);
        MergeSort(sourceArr,tempArr,midIndex+1,endIndex);
        Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);
    }
}

堆排序比较麻烦一点,需要理解的知识点较多,下次博客再详细写吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值