最近准备面试,重温数据结构,先给出各类排序算法,算法中注释比较少

若想下载注释比较全的源代码上我的csdn下载我上学的时候写的:

http://download.csdn.net/detail/jiezou007/1952628

与现在写的有些区别。

以下代码是这次写的,算法中对于指针与引用的选择。读者自己可以根据需要修改,冒泡算法是指针类型做函数变量,为了方便其余算法是C++引用。主函数中将注释更改后就可以实现各类排序算法。

#include

#include

#include

#define MAXSIZE 100

typedef struct

{

int key;

}RedType;

typedef struct

{

RedType r[MAXSIZE+1];

int Length;

}Sqlist;

//插入排序 O(n^2)

void InsertSort(Sqlist &L)

{

int i,j;

for (i=2;i

{

if (L.r[i].key

{

L.r[0].key=L.r[i].key;

//L.r[i].key=L.r[i-1].key;

for (j=i-1;L.r[0].key

L.r[j+1].key=L.r[j].key;

L.r[j+1].key=L.r[0].key;

}

}

}

//折半插入排序 O(n^2)

void BInsertSort(Sqlist &L)

{

int m,low,high,i;

for (i=2;i<=L.Length;++i)

L.r[0]=L.r[i];

low=1;

high=i-1;

while(low<=high)

{

m=(low+high)/2;

if (L.r[0].key

high=m-1;

else

low=m+1;

}

for (int j=i-1;j>=high+1;--j)

L.r[j+1]=L.r[j];

L.r[high+1]=L.r[0];

}

//快速排序中的冒泡排序 O(n^2)

void Bubble(Sqlist *L)

{

int n,i,k,j;

n=L->Length;

for (i=n;i>0;i--)

{

for (j=1;j

{

if (L->r[j].keyr[j+1].key)//从大到小

{

k=L->r[j].key;

L->r[j].key=L->r[j+1].key;

L->r[j+1].key=k;

}

}

}

}

int Partition(Sqlist &T,int low,int high)

{

int pivotkey;

pivotkey=T.r[low].key;

while(low

{

while(low=pivotkey)

--high;

T.r[low].key=T.r[high].key;

while(low

++low;

T.r[high].key=T.r[low].key;

}

T.r[low].key=pivotkey;

return low;

}

void QSort(Sqlist &L,int low,int high)

{

int pivotloc;

if (low

{

pivotloc=Partition(L,low,high);//一趟排序

QSort(L,low,pivotloc-1);

QSort(L,pivotloc+1,high);

}

}

//快速排序递归形式 O(n*log2(n))

void QuickSort(Sqlist &L)

{

QSort(L,1,L.Length);

}

int SelectMinKey(Sqlist &L,int low)

{

int i,j,t;

t=L.r[low].key;

j=low;

for (i=low+1;i

{

if (L.r[low].key

{

t=L.r[low].key;

j=i;

}

}

return j;

}

//简单选择排序 O(n^2)

void SelectSort(Sqlist &L)

{

int i,t,j;

for (i=1;i

{

j=SelectMinKey(L,i);

if (j!=i)

{

t=L.r[i].key;

L.r[i].key=L.r[j].key;

L.r[j].key=t;

}

}

}

//归并排序 O(n*log2(n))

void Merge(RedType sr[],RedType tr[],int i,int m,int n)

{

//将有序的SR[i,...,m]和SR[m+1,...,n]归并到有序的TR[i,..,n]

int j,k,h;

for (j=m+1,k=i;i<=m&&j<=n;k++)

{

if (sr[i].key<=sr[j].key)

tr[k].key=sr[i++].key;

else

tr[k].key=sr[j++].key;

}

if (i<=m)

{

for (h=0;h<=m-i;h++)

tr[k+h].key=sr[i+h].key;

}

if (j<=n)

{

for (h=0;h<=n-j;h++)

{

tr[k+h]=sr[j+h];

}

}

}

void MergeSort(RedType sr[],RedType tr1[],int s,int t)

{

int m;

RedType tr2[MAXSIZE+1];

if (s==t)

tr1[s]=sr[s];

else

{

m=(s+t)/2;

MergeSort(sr,tr2,s,m);

MergeSort(sr,tr2,m+1,t);

Merge(tr2,tr1,s,m,t);

}

}

void main()

{

system("cls");

Sqlist T;

int key,i=1;

printf("请输入数:\n");

scanf("%d",&key);

while(key!=0)

{

T.r[i++].key=key;

printf("请输入数:\n");

scanf("%d",&key);

T.Length=i-1;

}

//InsertSort(T); 插入排序,用引用

//BInsertSort(T);折半插入排序

//Bubble(&T);//冒泡排序,用指针试试

//QuickSort(T);//快速排序

//SelectSort(T);//简单选择排序

MergeSort(T.r,T.r,1,T.Length);//归并排序

printf("查找结果:\n");

for (i=1;i<=T.Length;i++)

{

printf("%d ",T.r[i].key);

}

getch();

}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐