排序系列(四)

4.插入法:
插入法较为复杂,它的基本工作原理是抽出牌,在前面的牌中寻找相应的位置插入,然后继续下一张
#include
<iostream.h>
void InsertSort(int* pData,int Count)
{
   
int iTemp;
   
int iPos;
   
for(int i=1;i<Count;i++)
    {
        iTemp
= pData[i];
        iPos
= i-1;
       
while((iPos>=0) && (iTemp<pData[iPos]))
        {
            pData[iPos
+1] = pData[iPos];
            iPos
--;
        }
        pData[iPos
+1] = iTemp;
    }
}


void main()
{
   
int data[] = {10,9,8,7,6,5,4};
    InsertSort(data,
7);
   
for (int i=0;i<7;i++)
        cout
<<data[i]<<" ";
    cout
<<"/n";
}

倒序(最糟情况)
第一轮:
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次

上面结尾的行为分析事实上造成了一种假象,让我们认为这种算法是简单算法中最好的,其实不是,因为其循环次数虽然并不固定,我们仍可以使用O方法。从上面的结果可以看出,循环的次数f(n)
<=1/2*n*(n-1)<=1/2*n*n。所以其复杂度仍为O(n*n)(这里说明一下,其实如果不是为了展示这些简单排序的不同,交换次数仍然可以这样推导)。现在看交换,从外观上看,交换次数是O(n)(推导类似选择法),但我们每次要进行与内层循环相同次数的‘=’操作。正常的一次交换我们需要三次‘=’而这里显然多了一些,所以我们浪费了时间。

最终,我个人认为,在简单排序算法中,选择法是最好的。

 

插入排序
#include <iostream>
using namespace std;

void coutstream(int a[],int n){
   
for(int i=0;i!=n;i++)
        cout
<<a[i]<<" ";
}

void insertsort(int a[],int n){
int temp;
   
for(int i=1;i<n;i++)
{
  
int j=i;
   temp
=a[i]; //先把a[i]位置的数据存起来
   while(j>0&&temp<a[j-1])
   {
    a[j]
=a[j-1];
    j
--;
   }
   a[j]
=temp;
}
}


int main()
{
   
int a[5]={1,6,4,8,4};
    insertsort(a,
5);//插入排序
    coutstream(a,5);//
    return 0;
}

来自:http://topic.csdn.net/u/20080928/14/4e7a079c-21c4-484b-ab80-3785beccd489.html

你可能感兴趣的:(排序系列(四))