归并排序:
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。我们一般取中位数,将前后两部分排序在归并为一个序列,递归完成。
#include <iostream>
using namespace std;
void merge(int a[],int low,int mid, int high)
{
int b[6];
int start = 0;
int i=low,j=mid+1;
while(i <= mid && j <= high)
{
if(a[i] <= a[j])
{
b[start] = a[i];
start++;
i++;
}
if(a[i] > a[j])
{
b[start] = a[j];
start++;
j++;
}
}
if(i <= mid)
{
for(int k = i;k<=mid;k++)
{
start++;
b[start] = a[k];
}
}
if(j <= high)
{
for(int m = j;m<=high;m++)
{
start++;
b[start] = a[m];
}
}
for(int n = 0;n<6;n++)
a[n] = b[n];
return;
}
void mergeSort(int a[],int low,int high)
{
int mid = 0;
if(low < high)
{
mid = (low + high)/2;
mergeSort(a,low,mid);
mergeSort(a,mid+1,high);
merge(a,low,mid,high);
}
return;
}
int main()
{
int a[] = {2,5,9,3,4,7};
mergeSort(a,0,5);
for(int i = 0;i<6;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
冒泡排序:
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
#include <iostream>
using namespace std;
void BubbleSort(int a[],int n)
{
int i=0,temp=0,j=0;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(a[j] > a[i])
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
return;
}
int main()
{
int a[]={2,5,4,3,6,7,1};
BubbleSort(a,7);
for(int i=0;i<7;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
选择排序:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
#include <iostream>
using namespace std;
void selectSort(int a[],int n)
{
int min=0,temp=0,j;
for(int i = 0; i < n;i++)
{
min = i;
for(j= i+1;j<n;j++)
{
if(a[j]>a[min])
min = j;
}
if(min != i)
{
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
return;
}
int main()
{
int a[]={2,5,4,3,6};
selectSort(a,5);
for(int i= 0;i<5;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
希尔排序:
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
#include <iostream>
using namespace std;
void shellSort(int a[],int n,int x)//一趟增量为x
{
int i,j;
for(i = x;i<n;i++)
{
if(a[i] < a[i-x])
{
int temp = a[i];
for(j= i-x;j>0 && temp<a[j];j-=x)
{
a[j+x] = a[j];
}
a[j+x]=temp;
}
}
}
void shell(int a[],int n,int b[],int x)
{
for(int k=0;k<x;k++)
shellSort(a,n,b[k]);
return;
}
int main()
{
int a[]={109,38,65,97,76,13,27,49,55,4};
int b[]={5,3,1};
shell(a,10,b,3);
for(int i = 0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}