linux sort 算法_【笔记】排序算法总结

一、直接插入排序

最简单的排序,其基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

void InsertSort(int* pData,intCount)

{intiTemp;intiPos;for(int i=1;i

{

iTemp=pData[i];

iPos= i-1;while((iPos>=0) && (iTemp

{

pData[iPos+1] =pData[iPos];

iPos--;

}

pData[iPos+1] =iTemp;

}

}

倒序(最糟情况)

第一轮:10,9,8,7->9,10,8,7(交换1次)(循环1次)

第二轮:9,10,8,7->8,9,10,7(交换1次)(循环2次)

第一轮:8,9,10,7->7,8,9,10(交换1次)(循环3次)

循环次数:6次 ;交换次数:3次

其他:

第一轮:8,10,7,9->8,10,7,9(交换0次)(循环1次)

第二轮:8,10,7,9->7,8,10,9(交换1次)(循环2次)

第一轮:7,8,10,9->7,8,9,10(交换1次)(循环1次)

循环次数:4次 ;交换次数:2次

二、冒泡排序

在冒泡排序的过程中,关键字较小的记录好比水中的气泡逐趟向上飘浮。过程:将第一个关键字与第二个关键字进行比较,如果逆序,则交换,然后将第二个关键字与第三个关键字比较,依次直到最后,这样最小的关键字就被排到了第一个位置上;然后从第二个关键字开始重复进行先前的步骤。另外,判断冒泡排序结束的条件是:在一趟排序过程中没有进行过交换记录的操作。

void BubbleSort(int* pData,intCount)

{intiTemp;

BOOL exchange_flag;for(int i=1;i

{for(int j=Count-1;j>=i;j--)

{

exchange_flag=FALSE;if(pData[j]

{

iTemp= pData[j-1];

pData[j-1] =pData[j];

pData[j]=iTemp;

exchange_flag=TRUE;

}if(!exchange_flag) return;

}

}

}

倒序(最糟情况)

第一轮:10,9,8,7->10,9,7,8->10,7,9,8->7,10,9,8(交换3次)

第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次)

第一轮:7,8,10,9->7,8,9,10(交换1次)

循环次数:6次 ;交换次数:6次

其他:

第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次)

第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次)

第一轮:7,8,10,9->7,8,9,10(交换1次)

循环次数:6次 ;交换次数:3次

三、选择排序

基本思想:从数据中选择最小的同第一个值交换,在从省下的部分中 选择最小的与第二个交换,这样往复下去。

void SelectSort(int* pData,intCount)

{intiTemp;intiPos;for(int i=0;i

{

iTemp=pData[i];

iPos=i;for(int j=i+1;j

{if(pData[j]

{

iTemp=pData[j];

iPos=j;

}

}

pData[iPos]=pData[i];

pData[i]=iTemp;

}

}

倒序(最糟情况)

第一轮:10,9,8,7->(iTemp=9)10,9,8,7->(iTemp=8)10,9,8,7->(iTemp=7)7,9,8,10(交换1次)

第二轮:7,9,8,10->7,9,8,10(iTemp=8)->(iTemp=8)7,8,9,10(交换1次)

第一轮:7,8,9,10->(iTemp=9)7,8,9,10(交换0次)

循环次数:6次 ;交换次数:2次

其他:

第一轮:8,10,7,9->(iTemp=8)8,10,7,9->(iTemp=7)8,10,7,9->(iTemp=7)7,10,8,9(交换1次)

第二轮:7,10,8,9->(iTemp=8)7,10,8,9->(iTemp=8)7,8,10,9(交换1次)

第一轮:7,8,10,9->(iTemp=9)7,8,9,10(交换1次)

循环次数:6次 ;交换次数:3次

四、快速排序

首先我们选择一个中间值middle程序中我们使用数组中间值,然后 把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使 用这个过程(最容易的方法——递归)。

void run(int* pData,int left,intright)

{inti,j;intmiddle,iTemp;

i=left;

j=right;

middle= pData[(left+right)/2]; //求中间值

do{while((pData[i]

i++;while((pData[j]>middle) && (j>left))//从右扫描大于中值的数

j--;if(i<=j)//找到了一对值

{//交换

iTemp =pData[i];

pData[i]=pData[j];

pData[j]=iTemp;

i++;

j--;

}

}while(i<=j);//如果两边扫描的下标交错,就停止(完成一次)//当左边部分有值(left

if(left

run(pData,left,j);//当右边部分有值(right>i),递归右半边

if(right>i)

run(pData,i,right);

}void QuickSort(int* pData,intCount)

{

run(pData,0,Count-1);

}

五、希尔排序

也称为缩小增量排序,基本思想:先将整个待排序记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。

六、比较

8fb3b210ba86fa8986376a8d1e9c685c.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值