直接插入排序法是一种简单的排序方法,它的基本思想就是把一个元素按升序或降序插入已经有序的一个序列里面,插入后保持序列的有序。假设有序列data[1..n],则将data[2]插入data[1..1]中,将data[3]插入data[1..2]中,将data[4]插入data[1..3]中。如此经过n-1次的插入,便可以使data[1..n]有序。
template<typename T>
void straipass(T *data,unsigned pos)

...{//一趟直接插入排序
//假设data[0..pos-1]是有序序列(data[i]<=data[i+1]),现将data[pos]插入data[0..pos-1]序列中,并保持有序
T x = data[pos];
int i = pos-1;
//按升序排列,如果按降序排序则用(data[i] < x)
for(; (i>=0) && ( data[i] > x ); i--)

...{
data[i+1] = data[i];
}
data[i+1] = x;
}

template<typename T>
void straisort(T *data,unsigned len)

...{//直接插入排序
for(unsigned i=1; i<len; i++)

...{
straipass( data, i );
}
}
int _tmain(int argc, _TCHAR* argv[])

...{


int arr[] = ...{100,5,1,3,11,3,6,-1};
straisort( arr, sizeof(arr)/sizeof(arr[0]) );
return 0;
}
一次直接插入排序的算法如下:
template<typename T>
void straipass(T *data,unsigned pos)
...{//一趟直接插入排序
//假设data[0..pos-1]是有序序列(data[i]<=data[i+1]),现将data[pos]插入data[0..pos-1]序列中,并保持有序
T x = data[pos];
int i = pos-1;
//按升序排列,如果按降序排序则用(data[i] < x)
for(; (i>=0) && ( data[i] > x ); i--)
...{
data[i+1] = data[i];
}
data[i+1] = x;
}
对于任何一次序列,我们只要经过n-1次插入便可实现排序:
template<typename T>
void straisort(T *data,unsigned len)
...{//直接插入排序
for(unsigned i=1; i<len; i++)
...{
straipass( data, i );
}
}调用方法如下:
int _tmain(int argc, _TCHAR* argv[])
...{

int arr[] = ...{100,5,1,3,11,3,6,-1};
straisort( arr, sizeof(arr)/sizeof(arr[0]) );
return 0;
}
本文介绍了一种简单直观的排序算法——直接插入排序。通过逐步解释其核心思想与具体实现过程,帮助读者理解如何通过该算法将一个无序序列转换为有序序列。文中还提供了具体的C++模板函数实现示例。
445

被折叠的 条评论
为什么被折叠?



