排序 -- 思路简析
Posted Y_ZhiWen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序 -- 思路简析相关的知识,希望对你有一定的参考价值。
简介
本篇文章总结一下最近学习的排序算法,提炼出其思想及不同之处。有直接插入排序,希尔排序,选择排序
直接插入排序(Insert Sort)
每次将无序区的第一个记录按关键字插入到有序区的合适位置,并将有序区长度加一
// 将a[0..len]进行插入排序,0号单元为哨兵
void InsertSort(int a[],int len)
// i标记有序区的最后一个位置
for(int i = 1; i < len; i ++)
// 如果需要将a[i+1]插入有序序列
if( a[i] > a[i+1] )
a[0] = a[i+1];
int j = i+1;
// 移动,记住<= >=
while(j>0 && a[j]>=a[0])
a[j] = a[j-1];
j --;
a[j+1] = a[0];
最坏情况下时间复杂度O(n²)
希尔排序(Shell Sort)
希尔排序是将整个待排序列(R₁,R₂,R₃,… Rn)按增量d划分成d个子序列,其中第i(1<=i<=d)个子序列为(Ri,Ri+d,Ri+2d,…Ri+kd ),并分别对各个子序列进行直接插入排序;不断减小增量d,重复这一过程,直到d减少到1,对整个序列进行一次直接插入排序
//对a[1..len]做一趟增量序列为 d 的希尔排序
void ShellInsert(int a[],int len,int d)
for( int i = 1; i + d <= len; i ++ )
if( a[i] > a[i+d] )
a[0] = a[i+d];
int j = i+d;
// 并且判断是否继续移动 ★★
while(j-d>0 && a[j]>=a[0])
a[j] = a[j-d];
j -= d;
a[j+d] = a[0];
void ShellSort(int a[],int len, int b[],int dlen)
for( int i = 0; i < dlen; i ++ )
ShellInsert(a,len,b[i]);
希尔排序的时间复杂度是所取增量序列的函数,尚难准确分析。
希尔排序是不稳定排序
选择排序(Selection Sort)
从待排序的序列中选择最小或者最大的元素,并将其交换到已排序的尾部
// 对a[1..len]进行选择排序
void SelectionSort(int a[],int len)
int sel;
for(int i = 1; i <= len; i ++ )
sel = i;
for( int j = i; j <= len; j ++)
if( a[sel] > a[j] )// 选出最小
sel = j;
// 进行交换
if( sel != i )
int t = a[sel];
a[sel] = a[i];
a[i] = t;
以上是关于排序 -- 思路简析的主要内容,如果未能解决你的问题,请参考以下文章