总结一下常见的排序算法,用代码实现
一、插入排序
算法思想:该算法假设有数组A,元素个数为N,假设前i-1个数都是排好序的,那么第i个输需要从i-1个数开始依次朝前比较,从而找到合适的位置插入,而该位置后面的数需要依次向后移动一个位置。
代码如下:(个人的编程风格)
#include<stdio.h>
typedef int INT;
typedef void VOID;
typedef short SHORT;
typedef long LONG;
typedef static STATIC;
typedef char CHAR;
/*************************************
author : ***明
date : 2013/12/11
description: 插入排序
IN : piData
IN :iLength
OUT :
**************************************/
VOID InsertSort(INT *piData, INT iLength)
{
INT i = 0;
INT j = 0;
INT iKey = 0;
for (j = 1; j < iLength; j ++)
{
iKey = *(piData + j);
i = j -1;
while((i >= 0) && (*(piData + i) > iKey))
{
*(piData + i + 1) = *(piData + i);
i = i - 1;
}
*(piData + i + 1) = iKey;
}
}
二、交换排序
算法思想:该算法假设有数组A,数组元素个数为N,首先从前N个数中选出最小的一个放在第一个位置,然后从剩余的N-1个数中选出最小的数放在第二个位置,依次循环,最后完成排序
代码如下:
/*************************************
author : **明
date : 2013/12/11
description : 选择排序
IN : piData
IN : iLength
OUT :
**************************************/
VOID ExchangeSort(INT *piData, INT iLength)
{
INT i = 0;
INT j = 0;
INT iMin = *piData;
for (i = 0; i < (iLength - 1); i++)
{
for (j = i + 1; j < iLength; j++)
{
if (iMin > (*(piData + j)))
{
iMin = *(piData + j);
*(piData + i) = iMin;
}
}
}
}
三、冒泡排序
算法思想:该算法假设有数组A,数组元素个数为N,拿第一个数和第二个数比较,如果第一个数比第二个大,则交换顺序,否则位置不变,然后依次拿第二个数和第三个比较,则遍历N个数后则保证最大的一个数在下标最大的位置。接着遍历前N-1个数,保证第二大的数在下标第二大的位置,以此类推。
代码如下:
/*************************************
author : **明
date : 2013/12/15
description : 冒泡排序
IN : piData
IN : iLength
OUT :
**************************************/
VOID BubbleSort(INT *piData, INT iLength)
{
INT i = 0;
INT j = 0;
INT iTemp = 0;
for (i = 0; i < (iLength - 1); i++)
{
for (j = 1; j < iLength - i; j++)
{
if(*(piData + j - 1) > *(piData + j))
{
iTemp = *(piData + j - 1);
*(piData + j - 1) = *(piData + j);
*(piData + j) = iTemp;
}
}
}
}
四、归并排序
算法思想:假设有两堆牌面朝上地放在桌上,每一堆都是排好序的,最小牌在最上面。选取顶上两张较小的一张,将其取出后,面朝下地放到输出堆中,(该堆中顶端会露出一张新的牌)。重复这个操作,直到其中一堆中牌放入为空,然后将另一队直接放入输出堆中即可。