排序
文章目录:
- 直接插入排序
- 折半插入排序
- 希尔排序
- 冒泡排序
- 快速排序
- 直接选择排序
- 堆排序
- 归并排序
- 基数排序
- 外部排序(子算法:置换选择排序,败者树,最佳归并树)
1.排序
1.排序的概述整理
2.算法的稳定性
3.内部和外部排序
2.直接插入排序
1.算法思想
2.执行过程
3.核心代码
4.具体代码
#include<stdio.h>
/*算法思路:每次比较刚开始要和前一个元素比较,
如果前一个元素大于该比较元素,
则先把前一个元素交换放到该比较元素的位置,然后j--,看前面是否有元素
如果没有元素,则把temp存的该比较元素放进之前前一个元素原来的位置
如果 j--前面有元素,则和此元素进行比较,如果这个元素大于该比较元素,则
此元素被放到前一个元素原来的位置,依次类推,直到前面没有元素或者遇到前面
元素小于该比较元素时,则退出本次内循环,把此时的temp放到a【j+1】中
*/
void insertsort(int a[],int n)
{
int i,j,temp;//temp作为临时值,将每次要比较的元素 存在temp里
for(i=1;i<n;i++)//因为每次刚开始都要和前一个元素进行比较,所以i从1开始,
{ temp=a[i];//存放每次要比较的元素
for(j=i-1;j>=0,a[j]>temp;j--)//和前面元素进行比较,如果该比较元素更小,则交换前一个元素,然后j--继续判断,如果不小,则 直接放进去。
{
a[j+1]=a[j]; //把前一个元素交换放到后面
}
a[j+1]=temp; //最后当前面没有元素或者遇到比该比较元素还小的元素,则退出循环,把temp内存的元素放进去
}
for(i=0;i<n;i++)//比较完输出
{
printf("%2d",a[i]);
}
}
int main()
{
int a[]={8,6,3,4,5,1,2,7};
insertsort(a,8);
}
3.折半插入排序
1.算法思想
2.执行过程实际上是折半查找加上元素移动的过程
3.核心代码
4.具体代码
/*
算法流程:
1:循环插入元素
2.对要插入元素前面的元素进行拆半查找
3.找到待插入位置后,先将要插入位置之后的元素向后移动一位一直到要进行插入的元素
4.将待插元素插入此位置
*/#include<stdio.h>
void HalfSort(int a[],int n){
int i,j,low,high,mid,k;
for(i=1;i<n;i++){
k=a[i];//循环插入元素
low=0;//开始坐标
high=i-1;//末尾坐标,这里注意每次拆半插入的范围都是下标从0到要插入元素的前一个元素
//插入前都要将要插入位置之后的元素向后移动一位一直到要进行插入的元素
while(low<=high){//寻找插入位置
mid=(low+high)/2;//中间位置的值
if(a[mid]>k)//如果待插元素小于中间位置 的值,则把插入范围缩到中间位置的前面,否则,插入范围缩到中间位置的后面
high=mid-1;//查找左半部分
else low=mid+1;//查找右半部分
}
for(j=i-1;j>=high;j--){//后移要插入位置之后的元素,腾出插入位置
a[j+1]=a[j];
}
a[high+1]=k;//插入待插元素 ,注意当high的值大于low的值时,停止循环,
//此时,待插入元素的位置是high的后一位,也就是low。所以a[high+1]=k;也可以写成a[low]=k;
}
for(int i=0;i<n;i++)//输出
{
printf("%5d",a[i]);
}
}
int main()
{
int a[]={34,65,87,54,23,64};
HalfSort(a,6);
}
4.希尔排序
1.希尔排序(使序列基本有序后再进行一次直接插入排序)
2.执行过程包括缩小增量的排序,每次不断的缩小增量,直到增量为1时再进行一趟直接插入排序就OK了(之后进行元素后移,把待插入关键字插到移到找到的正确位置上)
3.核心代码
4.具体代码
#include<stdio.h>
void shellsort(int a[],int n)
{
int i,j,temp;
int gap=n;
do
{
gap=gap/3+1;
for(i=gap;i<n;i+=gap)
{
temp=a[i];
for(j=i-gap;j>=0,a[j]>temp;j-=gap)
{
a[j+gap]=a[j];
}
a[j+gap]=temp;
}
}while(gap>1);
for(i=0;i<n;i++)
{
printf("%d",a[i]);
}
}
int main()
{
int a[]={8,6,3,4,5,1,2,7};
shellsort(a,8);
}
这里插入排序的三种排序算法就整理完了,之后会更新交换排序的两种算法,冒泡排序和快速排序。
2020.8.7.