Chinaunix首页 | 论坛 | 博客
  • 博客访问: 234345
  • 博文数量: 43
  • 博客积分: 391
  • 博客等级: 二等列兵
  • 技术积分: 352
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 11:29
个人简介

现在的我,不埋怨谁,不嘲笑谁,也不羡慕谁。阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。一切都好,真的,都很好。

文章分类

全部博文(43)

文章存档

2018年(2)

2017年(1)

2015年(2)

2014年(27)

2013年(1)

2012年(10)

我的朋友

分类: Java

2014-08-08 23:18:22

插入排序
1.直接插入排序


原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。


要点:设立哨兵,作为临时存储和判断数组边界之用。


实现:


Void InsertSort(Node L[],int length)


{


Int i,j;//分别为有序区和无序区指针


for(i=1;i

{


j=i+1;


if(L[j]

{


L[0]=L[j];//存储待排序元素


While(L[0]

{


L[i+1]=L[i];//移动


i--;//查找


}


L[i+1]=L[0];//将元素插入


}


i=j-1;//还原有序区指针


}


}


2.希尔排序


原理:又称增量缩小排序。先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。


要点:增量的选择以及排序最终以1为增量进行排序结束。


实现:


Void shellSort(Node L[],int d)


{


While(d>=1)//直到增量缩小为1


{


Shell(L,d);


d=d/2;//缩小增量


}


}


Void Shell(Node L[],int d)


{


Int i,j;


For(i=d+1;i

{


if(L[i]

{


L[0]=L[i];


j=i-d;


While(j>0&&L[j]>L[0])


{


L[j+d]=L[j];//移动


j=j-d;//查找


}


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


}


}


}


交换排序


1.冒泡排序


原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序。


要点:设计交换判断条件,提前结束以排好序的序列循环。


实现:


Void BubbleSort(Node L[])


{


Int i ,j;


Bool ischanged;//设计跳出条件


For(j=n;j<0;j--)


{


ischanged =false;


For(i=0;i

{


If(L[i]>L[i+1])//如果发现较重元素就向后移动


{


Int temp=L[i];


L[i]=L[i+1];


L[i+1]=temp;


Ischanged =true;


}


}


If(!ischanged)//若没有移动则说明序列已经有序,直接跳出


Break;


}


}


2.快速排序


原理:不断寻找一个序列的中点,然后对中点左右的序列递归的进行排序,直至全部序列排序完成,使用了分治的思想。


要点:递归、分治


实现:








选择排序


1.直接选择排序


原理:将序列划分为无序和有序区,寻找无序区中的最小值和无序区的首元素交换,有序区扩大一个,循环最终完成全部排序。


要点:


实现:


Void SelectSort(Node L[])


{


Int i,j,k;//分别为有序区,无序区,无序区最小元素指针


For(i=0;i

{


k=i;


For(j=i+1;j

{


If(L[j]

k=j;


}


If(k!=i)//若发现最小元素,则移动到有序区


{


Int temp=L[k];


L[k]=L[i];


L[i]=L[temp];


}


 


}


}


2.堆排序


原理:利用大根堆或小根堆思想,首先建立堆,然后将堆首与堆尾交换,堆尾之后为有序区。


要点:建堆、交换、调整堆


实现:


Void HeapSort(Node L[])


{


BuildingHeap(L);//建堆(大根堆)


For(int i=n;i>0;i--)//交换


{


Int temp=L[i];


L[i]=L[0];


L[0]=temp;


Heapify(L,0,i);//调整堆


}


}








Void BuildingHeap(Node L[])


{ For(i=length/2 -1;i>0;i--)


Heapify(L,i,length);


}


归并排序


原理:将原序列划分为有序的两个序列,然后利用归并算法进行合并,合并之后即为有序序列。


要点:归并、分治


实现:


Void MergeSort(Node L[],int m,int n)


{


Int k;


If(m

{


K=(m+n)/2;


MergeSort(L,m,k);


MergeSort(L,k+1,n);


Merge(L,m,k,n);


}


}








基数排序


原理:将数字按位数划分出n个关键字,每次针对一个关键字进行排序,然后针对排序后的序列进行下一个关键字的排序,循环至所有关键字都使用过则排序完成。


要点:对关键字的选取,元素分配收集。


实现:


Void RadixSort(Node L[],length,maxradix)


{


Int m,n,k,lsp;


k=1;m=1;


Int temp[10][length-1];


Empty(temp); //清空临时空间


While(k

{


For(int i=0;i




If(L[i]

Temp[0][n]=L[i];


Else


Lsp=(L[i]/m)%10; //确定关键字


Temp[lsp][n]=L[i];


n++;


}


CollectElement(L,Temp); //收集


n=0;


m=m*10;


k++;


}


}


阅读(508) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~