几种排序算法总结

1.直接插入排序 

思路:例如54321这样一个序列我们将A[1]默认为有序区(我们将A[0]作为暂存单元)  那么在排序过程中我们从第二个元素开始依次插入有序区 若待插元素小于前一个元素 就将前面的元素依次后移 直到找到合适位置


void InsertSort(int A[],int length)//用0号单元暂存待排元素

{

   for(int i=2;i<=length;i++)//从2号元素开始筛选

{  

      A[0] = A[i];//待插元素放在A[0]

   for(int j = i-1;A[0]<A[j];j--)//将元素依次后移

{

   A[j+1] = A[j];

}

A[j+1] = A[0];//插入待插元素

}

}


时间复杂度:o(n^2);

空间复杂度:1


2.希尔排序(0号作为暂存单元)

for(int d= n/2;d>=1;d=d/2)

{

for(int i = d+1;i<=n;i++)

{

   A[0] = A[i;

for(int j =i-d;j>0&&A[0]<A[j];j=j-d)

{

  A[j+d] = A[j];

}

A[j+d] = A[0];

}

}

}


3.气泡排序

exchange = n;

while(exchange!=0)

{

int bound = exchange;

exchange = 0;


for(int i=1;i<bound;i++)

{

if(A[i]>A[i+1])

{  

//交换A[i]和A[i+1]的位置

}

}

exchange = i;

}

时间复杂度:O(n^2)


4.快速排序

int quickSort(int A[],int begin,int end )

{

 while(begin<end)

{  

    //右侧扫面

while(begin<end&&A[end]>A[begin])

{

 --end;

}

if(begin<end)

{

//A[first]和A[end]互换

++first

}

//左侧扫描

while(begin<end&&A[end]>A[begin])

{

 ++first;

}

if(begin<end)

{

//A[first]和A[end]互换

--end;

}

return first;


}

}


void Qs(int A[],int first,int end)

{

while(first<end)

{

  int pivot = quickSort(A,first,end);

  Qs(A,first,pivot-1);//左子树

 Qs(A,pivot+1,end);//右子树

}

}

时间复杂度;O(nlog2n);

空间复杂度:O(log2n);


5.简单选择排序

for(int i=1;i<n;i++)

{

  int index = i;

for(int j = i+1;i<=n;i++)

{

 if(A[i]<A[intdex])

index = j;

}
if(index!=i)

{

//A[i]和A[index]对换

}


}

  }

时间复杂度:O(n2);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值