数据结构各类排序算法详解+代码分析

前言

不知不觉,数据结构已经学完了,博主也马上大二了😭时间过得太快了😱,但是数据结构学得确实不太好,楼主花了将近一天的时间整理了一下排序的有关算法。希望对大家也有所帮助。


插入排序


基本思想

每步将一个待排序记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。

直接插入排序


void InsertSort ( SqList &L ) {
   
    //对顺序表L作直接插入排序
for ( i = 2; i <=L.length; ++ i )
//直接在原始无序表L中排序
if (L.r[i].key < L.r[i-1].key) //若L.r[i]较小则插入有序子表内
{
   
    L.r[0]= L.r[i]; //先将待插入的元素放入“哨兵”位置
L.r[i]= L.r[i-1]; //子表元素开始后移
for ( j=i-2; L.r[0].key < L.r[j].key; --j ) L.r[j+1]= L.r[j];
//只要子表元素比哨兵大就不断后移
L.r[j+1]= L.r[0]; //直到子表元素小于哨兵,将哨兵值送入
		//当前要插入的位置(包括插入到表首)
 	} //if
}// InsertSort

从第二个记录开始逐趟开始插入

折半插入排序


这个相对于直接插入排序,减少了比较的次数,但是没有减少移动的次数: n 2 n^2 n2 / 4次

只是我们查找插入的位置时,使用了折半查找的方法。

二路排序


相比之下,减少了移动的次数,约为 n 2 n^2 n2 / 8次

二路排序

#include <stdio.h>
#include <stdlib.h>
void insert(int arr[], int temp[], int n)
{
   
   
    int i,first,final,k;
    first = final = 0;//分别记录temp数组中最大值和最小值的位置
    temp[0] = arr[0];
    for (i = 1; i < n; i ++){
   
   
        // 待插入元素比最小的元素小
        if (arr[i] < temp[first]){
   
   
            first = (first - 1 + n) % n;
            temp[first] = arr[i];
        }
        // 待插入元素比最大元素大
        else if (arr[i] > temp[final]){
   
   
            final = (final + 1 + n) % n;
            temp[final] = arr[i];
        }
        // 插入元素比最小大,比最大小
        else {
   
   
            k = (final + 1 + n) % n;
            //当插入值比当前值小时,需要移动当前值的位置
            while (temp[((k - 1) + n) % n] > arr[i]) {
   
   
                temp[(k + n) % n] =temp
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值