void InsertSort(int a[],int n)//一发入魂,完美
{
for(int i=1;i<n;i++)
{
int t=i;
for(int j=i-1;j>=0&&a[j]>a[t];--j)
{
swap(a[j],a[t]);
t=j;
}
}
}一趟排序可以使部分有序(即已排序部分,但是一趟排序不能确定最终位置
插入排序+二分查找(因为部分有序所以可以使用二分啊
void insertsort2(int a[],int n)
{
for(int i=1;i<n;i++)
{
if(a[i-1]>a[i])
{
int low,high,mid,temp=a[i];
for(low=0,high=i-1,mid=(high+low)/2;low<=high;mid=(high+low)/2)
//注意终止判断条件以及循环更新哪个变量。
//停止条件不用保证a[mid]>temp这种,且每次循环后要更新mid
if(a[mid]>temp) high=mid-1;
else low=mid+1;
for(int j=i-1;j>=low;--j) a[j+1]=a[j];
a[low]=temp;
}
}
}
一发入魂
void BubbleSort(int a[],int n)//done
{
for(int i=0;i<n-1;i++)
{
bool ischanged = false;
for(int j=n-1;j>i;--j)
{
if(a[j]<a[j-1])
{
swap(a[j],a[j-1]);
ischanged=true;
}
}
if(!ischanged) break;//即本次遍历无数据移动,数组已有序。
}
}
一发入魂
void ShellSort(int a[],int n)
{
int i,j,temp;
for(int s=n/2;s>=1;s=s/2)//每次遍历之后更改步长。
{
for(i=s;i<n;++i)
{
if(a[i]<a[i-s])
{
temp = a[i];
for(j=i-s;j>=0&&a[j]>temp;j-=s) a[j+s]=a[j];
a[j+s]=temp;
}
}
}
}
①快排里的划分函数第一趟写的时候没注意循环里的判断溢出条件,导致程序越界。注意循环里也要判断越界哦!!!
②还有就是,自己写的这个快排是取闭区间的即 x∈[low,high]
int portition(int a[],int low,int high)
{
int pivot = a[low],lef=low,rig=high;
while(lef<rig)
{
while(lef<rig&&a[rig]>pivot)rig--;//注意循环内也要防止越界哦
a[lef]=a[rig];
while(lef<rig&&a[lef]<pivot)lef++;
a[rig]=a[lef];
}
a[lef]=pivot;
return lef;
}
void QuickSort(int a[],int low,int high)//上下界为闭区间 x ∈ [low,high]
{
if(low>high) return;
int pivots=portition(a,low,high);
QuickSort(a,low,pivots-1 );
QuickSort(a,pivots+1,high);
}
堆排序里他的cmp条件一定得是>=不然会error,或者死循环(明明我的测试数据里面没有重复的数据😣😣)
void HeadAdjust(int a[],int k,int n)
{
int temp = a[k];
for(int i=2*k;i<n;i*=2)
{
if(i+1<n&&a[i+1]>a[i]) i=i+1;
if(a[i]<=temp) break; //cmp
//此处一定要大于等于?否则会error
a[k]=a[i];
k=i;
}
a[k]=temp;
}
void IniHugeDickHeap(int a[],int n)
{
for(int i=n/2;i>=0;--i) HeadAdjust(a,i,n);
}
void HeapSort(int a[],int n)
{
IniHugeDickHeap(a,n);
for(int i=n-1;i>=0;--i)
{
swap(a[0],a[i]);
HeadAdjust(a,0,i);
}
}
归并排序的主程序要先进行分治(递归,把大的问题分成小的子问题),再进行计算。
void Merge(int a[],int low,int mid,int high)
{
int i,p1=low,p2=mid+1,*b=new int [100];
for(int i=low;i<=high;++i)
b[i]=a[i];//拷贝数组
for(i=low;p1<=mid&&p2<=high;++i)
{
if(a[p1]<=a[p2]) b[i]=a[p1++];//确保稳定性
else b[i]=a[p2++];
}
while(p1<=mid) b[i++]=a[p1++];
while(p2<=high) b[i++]=a[p2++];
}
void MergeSort(int a[],int low,int high)
{
if(low>high) return;
int mid = (low+high)/2;
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
//先分治,当子问题都解决了再来解决大的问题
Merge(a,low,mid,high);
}