排序算法学习
排序算法
学习自六大排序算法
冒泡排序
//冒泡排序
void MPswap(int* arr,int n)
{
int end=n;
while(end)//最好的情况处理N次,最差的情况N*N次
{
int flag =0;
for(int i=1;i<end;++i)//不能i++
{
if(arr[i-1]>arr[i])//前一项比当前项大,交换位置
{
int temp=arr[i];
arr[i]=arr[i-1];
arr[i-1]=temp;
flag=1;
}
}
if(flag == 0)//当所有元素排列完毕 不再有大在前的情况flag为0则跳出while循环
{
break;
}
}
}
插入排序
//插入排序 多少有点难理解,老老实实看原文讲解
//必须理解了怎么排的序
void CRswap(int* arr,int n)
{
for(int i=0;i<n-1;++i)
{
int end=i;//记下有序序列最后一个元素下标
int temp=arr[end+i];//将要被排序的元素
while(end>=0)
{
if(temp<arr[end])//temp向前比较一位,如果小于
{
arr[end+1]=arr[end]//前方元素后移(temp的值未变)
end--;
}
else break;
}
arr[end+1]=temp;
}
}
希尔排序
大佬确实厉害,下面的写法兼顾了gap≠1时的置换和gap=1时候的插入排序
//希尔排序 注意和插入排序的联系
void ShellSort(int* arr,int n)
{
int gap=n;
while(gap<1)//gap>1使最后一次循环gap最大仅能为1
{
gap=gap/2;//gap每次对半
for(int i=0;i<n-gap;++i)//每次仅需要比较n-gap个元素
{
int end=i;
int temp=arr[end+gap];//temp此时为后面的元素
while(end>=0)
{
if(temp<arr[end])//如果后面的小于前面的
{
arr[end+gap]=arr[end];//换位
end-=gap;//个人感觉这一步是为了和下面[end+gap]=temp联用
}
else break;
}
arr[end+gap]=temp;
}
}
选择排序
//选择排序 一次寻找最大值和最小值可以增加一倍效率
void swap(int*x,int*y)
{
int temp=*x;
*x=*y;
*y=temp;
}
void SelectSort(int* arr,int n);
{
int begin = 0;int end=n-1;//记录起始位置与结尾位置
while(begin<end)
int max=begin;
int min=begin;//记录最大值最小值的编号
for(int i=begin;i<=end;++i)
{
if(arr[i]<arr[min])
mini=i;
if(arr[i]>arr[max])
max=i;//若碰到比最大值/最小值大/小的,则替换编号
}
swap(&arr[begin],&arr[min]);//最小值放最前
if(begin == max)max=min;//防止最大的数在begin位置被换走
swap(&arr[end],&arr[max]);//最大值放最后
begin++;
end--;
}