大三了马上要找工作,先把各种排序算法写一写练练笔。
#include <iostream>
using namespace std;
#define MAX 50 //归并排序临时数组
int a[8] ={5,6,4,8,3,2,7,1};
int b[9] ={1,2,4,5,5,6,7,8,9};
//直接插入
void InsertSort(int a[], int n)
{
int i,j,t;
for(i=1; i<n; i++)
{
t = a[i];
for(j=i; j>0 && t<a[j-1]; j--)
a[j] = a[j-1];
a[j] = t;
}
}
//希尔排序
void ShellSort(int a[], int n)
{
int i,j,k,t;
k = n/2;
while(k>0)
{
for(i=k;i<n;i++)
{
t = a[i];
for(j=i; j>0 && t<a[j-k]; j-=k)
a[j] = a[j-k];
a[j] = t;
}
k /= 2;
}
}
//冒泡
//还有一种局部冒泡,可以跳过已是顺序的k个连续元素,但要额外引入一个标记变量且每次交换都要记录,数据特别随机的话开销也不小...
void Bubble(int a[], int n)
{
int temp;
bool flag;
for(int i=n-1; i>0; i--)
{
flag = false;
for(int j=0; j<i; j++)
{
if(a[j]>a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = true;
}
}
if (flag == false)
break;
}
}
//快排
void QuickSort(int a[], int l, int u)
{
if( l >= u)
return;
int i = l+1;
int j = u;
int temp;
while(i<j)
{
while( i<=u && a[i] < a[l])
i++;
while( a[j] > a[l])
j--;
if( i < j )
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
temp = a[l];
a[l] = a[j];
a[j] = temp;
QuickSort( a, l, j-1);
QuickSort( a, j+1, u);
}
//归并排序
//归并,非递归
void Merge(int a[], int a0, int an, int b0, int bn) //归并a[]中下标a0~an、b0~bn的两组数
{
int c[MAX];
int i = a0;
int k = i;
int j = b0;
while(1)
{ if( a[i] <= a[j]) //"="保持排序稳定性
c[k++] = a[i++];
else
c[k++] = a[j++];
if( i > an) //a0~an排完
{
while( j <= bn)
c[k++] = a[j++];
break;
}
if( j > bn) //b0~bn排完
{
while( i <= an)
c[k++] = a[i++];
break;
}
}
for( int m = a0; m <= bn; m++)
a[m] = c[m];
}
void MergeOnce(int a[], int n,int d) //数组a[]以d为间隔归并
{
int k = 0 ;
while (k+2*d-1 < n)
{
Merge(a,k,k+d-1,k+d,k+2*d-1);
k += (2*d);
}
if( n % d != 0) //一次归并个数不足的
if( k+d <= n)
Merge(a,k,k+d-1,k+d,n-1);
}
void MergeSort(int a[],int n)
{
int d = 1; //d是间隔,不是组内元素个数,开始用的2....花了2h才找到T_T
while (d <= n)
{
MergeOnce(a, n, d);
d *= 2;
}
}
//堆排
//堆排序
void siftup(int a[],int n) //pre:小堆heap[0,n-1],n是下标; post:a[n]入堆,构建小堆heap[0,n] ,n为最末下标
{
int temp;
int p=n/2;
while(1)
{
if( n == 0)
break;
if(a[n]<a[p])
{
temp = a[p];
a[p] = a[n];
a[n] = temp;
n = p;
p = n/2;
}
else
break;
}
}
void siftdown(int a[], int n) //pre:小堆[1,n] post:小堆[0,n],n为最末下标 调用时须满足n>1
{
int r = 0; ///root
int c; //child
int temp;
while(1)
{
if(r == 0)
c=1;
else
c = 2*r;
if(c>n)
break;
if(c+1<=n)
if(a[c+1]<a[c])
c++;
if(a[r]>a[c])
{
temp = a[c];
a[c] = a[r];
a[r] = temp;
r = c;
}
else
break;
}
}
void HeapSort(int a[], int n) //n是下标
{
int temp;
for( int i=1; i<=n; i++)
siftup(a,i);
for( int j=n; j>=1; j--)
{
cout<<a[0]<<" ";
temp = a[0];
a[0] = a[j];
a[j] = temp;
siftdown(a,j-1);
}
cout<<a[0]<<endl;
}
//另加个二分搜索
//另加个二分搜索
int BinSearch(int a[], int low, int up, int d)
{
if( low > up ) //不仅仅是简单的l、u取值容错, 考虑到递归到最后不成功的特殊情况,该条件就大大地有用了!(PS. l=u±1)
return -1;
int mid = ( low + up ) / 2;
if( a[mid] == d)
return mid;
else if( d < a[mid])
BinSearch(a, low, mid-1, d);
else if( d > a[mid])
BinSearch(a, mid+1, up, d);
}
void main()
{
HeapSort(a,7);
// InsertSort(a,7);
// ShellSort(a,7);
// Bubble(a,7);
// QuickSort(a,7);
// MergeSort(a,7);
// HeapSort(a,n)
// for(int i=0;i<8;i++)
// cout<<a[i]<<" ";
}