随手记录--java排序(1)冒泡、选择、希尔、归并
2017-05-01 21:07
288 查看
/**
* 迭代的对序列中的元素进行比较,需要就交换
* 没有交换操作就意味着排序完成
* @param A
* @param n
*/
void BubbleSort(int A[],int n){
int pass,i,temp,swapped=1;
for(pass=n-1;(pass>=0) || (swapped!=0);pass--){
swapped=0;
for(i=0;i<pass-1;i++){
if(A[i]>A[i+1]){
temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
swapped=1;
}
}
}
}
//选择排序是原地排序算法,适用于小文件,优点:容易实现,不需要额外空间
//缺点,扩展性差
void Selection(int a[],int n){
int i,j,min,temp;
for (i = 0; i< n-1; i++) {
min=i;
for(j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j;
}
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
/**
* 插入排序
* 迭代地随机的从序列中读取操作并插入待排序序列
*优点:实现简单,不需要额外辅助空间,
*/
void InsertSort(int a[],int n){
int i,j,v;
for(i=2;i<n-1;i++){
v=a[i];
j=i;
while(a[j-1]>v && j>=1){
a[j]=a[j-1];
j--;
}
a[j]=v;
}
}
/**
* 希尔排序,即缩小增量排序,也称n间距插入排序
* 比较和交换数组中每个距离为h的元素,然后h--
* 小列表适合
*/
void ShellSort(int a[],int size){
int i,j,h,v;
for(h=1;h <=(size/9);h = 3*h + 1);
for( ; h>0 ;h=h/3){
for(i=h+1;i<=size;i+=1){
v=a[i];
j=i;
while(j>h && a[j-h]>v){
a[j]=a[j-h];
j-=h;
a[j]=v;
}
}
}
}
/**
* 归并排序,分治
* 归并:把两个已排序的合并乘更大的已排序的
* 选择:把文件分层包含k个最小元素和n-k个最大元素
*
*/
void mergeSort(int a[],int temp[],int left,int right){
int mid;
if(right > left){
mid=(right+left)/2;
mergeSort(a,temp,left,mid);
mergeSort(a,temp,mid+1,right);
merge(a,temp,left,mid+1,right);
}
}
void merge(int a[],int temp[],int left,int mid,int right){
int i,left_end,temp_pos,size;
left_end=mid-1;
temp_pos=left;
size=right-left+1;
while((left<=left_end)&&(mid<=right)){
if(a[left]<=a[mid]){
temp[temp_pos]=a[left];
temp_pos=temp_pos+1;
left=left+1;
}else{
temp[temp_pos]=a[mid];
temp_pos=temp_pos+1;
mid=mid+1;
}
}
while(left<=left_end){
temp[temp_pos]=a[left];
left=left+1;
temp_pos=temp_pos+1;
}
while(mid<=right){
temp[temp_pos]=a[mid];
mid=mid+1;
temp_pos=temp_pos+1;
}
for(i=0;i<=size;i++){
a[right]=temp[right];
right=right-1;
}
}
* 迭代的对序列中的元素进行比较,需要就交换
* 没有交换操作就意味着排序完成
* @param A
* @param n
*/
void BubbleSort(int A[],int n){
int pass,i,temp,swapped=1;
for(pass=n-1;(pass>=0) || (swapped!=0);pass--){
swapped=0;
for(i=0;i<pass-1;i++){
if(A[i]>A[i+1]){
temp=A[i];
A[i]=A[i+1];
A[i+1]=temp;
swapped=1;
}
}
}
}
//选择排序是原地排序算法,适用于小文件,优点:容易实现,不需要额外空间
//缺点,扩展性差
void Selection(int a[],int n){
int i,j,min,temp;
for (i = 0; i< n-1; i++) {
min=i;
for(j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j;
}
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
/**
* 插入排序
* 迭代地随机的从序列中读取操作并插入待排序序列
*优点:实现简单,不需要额外辅助空间,
*/
void InsertSort(int a[],int n){
int i,j,v;
for(i=2;i<n-1;i++){
v=a[i];
j=i;
while(a[j-1]>v && j>=1){
a[j]=a[j-1];
j--;
}
a[j]=v;
}
}
/**
* 希尔排序,即缩小增量排序,也称n间距插入排序
* 比较和交换数组中每个距离为h的元素,然后h--
* 小列表适合
*/
void ShellSort(int a[],int size){
int i,j,h,v;
for(h=1;h <=(size/9);h = 3*h + 1);
for( ; h>0 ;h=h/3){
for(i=h+1;i<=size;i+=1){
v=a[i];
j=i;
while(j>h && a[j-h]>v){
a[j]=a[j-h];
j-=h;
a[j]=v;
}
}
}
}
/**
* 归并排序,分治
* 归并:把两个已排序的合并乘更大的已排序的
* 选择:把文件分层包含k个最小元素和n-k个最大元素
*
*/
void mergeSort(int a[],int temp[],int left,int right){
int mid;
if(right > left){
mid=(right+left)/2;
mergeSort(a,temp,left,mid);
mergeSort(a,temp,mid+1,right);
merge(a,temp,left,mid+1,right);
}
}
void merge(int a[],int temp[],int left,int mid,int right){
int i,left_end,temp_pos,size;
left_end=mid-1;
temp_pos=left;
size=right-left+1;
while((left<=left_end)&&(mid<=right)){
if(a[left]<=a[mid]){
temp[temp_pos]=a[left];
temp_pos=temp_pos+1;
left=left+1;
}else{
temp[temp_pos]=a[mid];
temp_pos=temp_pos+1;
mid=mid+1;
}
}
while(left<=left_end){
temp[temp_pos]=a[left];
left=left+1;
temp_pos=temp_pos+1;
}
while(mid<=right){
temp[temp_pos]=a[mid];
mid=mid+1;
temp_pos=temp_pos+1;
}
for(i=0;i<=size;i++){
a[right]=temp[right];
right=right-1;
}
}
相关文章推荐
- Java实现的排序算法及比较 [冒泡,选择,插入,归并,希尔,快排]
- java实现七大排序(插入,冒泡,选择,快速,堆,希尔,归并)
- 排序算法Java描述:选择、冒泡、插入、希尔、归并、快速及三向切分快速排序
- Java实现数组排序总结篇(冒泡,选择,插入,希尔)
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- Java-十种内部排序实现(选择,冒泡,插入,希尔,堆,归并,快速,基数,计数,桶)及代码下载
- 六大经典排序算法(Java版):冒泡、选择、插入、希尔、快速、归并
- java中的排序(选择,冒泡,希尔,插入)
- 《冒泡,选择,插入,归并,希尔,快速》排序算法java实现一览
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
- 数组排序(插入、选择、希尔、堆、归并、快速、冒泡)
- Java各种排序算法汇总(冒泡,选择,归并,希尔及堆排序等)
- Java数组排序总结(冒泡,选择,插入,希尔)
- 排序算法大集合,插入、选择、冒泡、希尔、堆、归并、快速排序,总有一款适合你
- 数据结构(C#)--冒泡、插入、快速、堆、归并、希尔、选择各种排序排序过程比较以及各种排序的所用时间的对比
- C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
- 数据结构 27 排序 排序-选择 插入 冒泡 希尔 快速归并 6种排序
- Java数组排序总结(冒泡,选择,插入,希尔)
- 常用排序算法简介与java实现(冒泡、插入、选择、希尔、归并、快排)
- 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)