皮皮虾靠什么攻击:【排序结构1】插入排序

来源:百度文库 编辑:偶看新闻 时间:2024/05/05 05:55:39

1、基本概念介绍

(1) 如果待排序列中有两个相同的关键字 Ki = Kj,其顺序是Ki在Kj之前。如果经过排序之后,Ki 和 Kj的顺序颠倒了,则说明这个排序方法是不稳定的。否则则是稳定排序。

(2) 在内存中就可以完成的排序过程,称为内部排序。如果待排数据量很大,内存不够容纳全部数据,在排序过程中必须对外存进行访问,则叫做外部排序。

实际上,由于数据量级别不同。排序的方法会有很大的改变,思考排序效率的角度也不一样。这个专题系列未经特殊注明,都属于内部排序方法。

2、直接插入排序 O(N^2)

将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。下面通过一个例子来说明这个排序流程:

待排序列: 49, 38 , 65 , 97, 76 , 13, 27 ,49

插入49: 49

插入38: 38, 49

插入65: 38, 49, 65

插入97: 38, 49, 65, 97

插入76: 38, 49, 65, 76, 97

插入13: 13, 38, 49, 65, 76, 97

插入27: 13, 27, 38, 49, 65, 76, 97

插入49: 13, 27, 38, 49, 49, 65, 76, 97

Cpp代码
  1. #include
  2. /******************************
  3. * 直接插入排序 Straight Insertion Sort *
  4. ******************************/
  5. class SISortion{
  6. public:
  7. //递增稳定排序
  8. static void inc_sort(int keys[], int size);
  9. };
  10. void SISortion:: inc_sort(int keys[], int size){
  11. //记录当前要插入的key
  12. int post_key;
  13. //从第二个数据开始
  14. for(int i=1;i
  15. post_key=keys[i];
  16. int j;
  17. //将比post_key要大的前面所有的key依次后移一位
  18. for(j=i-1;j>=0;j--){
  19. if(post_key
  20. keys[j+1]=keys[j];
  21. else
  22. break;
  23. }
  24. //将post_key插入到合适位置
  25. keys[j+1]=post_key;
  26. }
  27. //打印排序结果
  28. for(int k=0;k
  29. cout<
  30. cout<
  31. }
  32. //Test SISortion
  33. void main(){
  34. int raw[]={49,38,65,97,76,13,27,49};
  35. int size=sizeof(raw)/sizeof(int);
  36. SISortion::inc_sort(raw,size);
  37. }