前言:
对于排序,也是想了很久,但是对于这几种排序,对于我来说,以下的一些思路以及实现方法更容易理解,不足之处,还望指出 感谢
冒泡排序
针对冒泡排序,我认为是相邻的两个元素相互比较,如果前面的元素比后面的元素大那么他们就互换
图示:
int *maopao(int *arr,int n)
{
printf("现在输入数据:\n");
for(int i=0;i<n;i++)//数组输入数据
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++)
{//这里代表比较的趟数,从第一个比较到最后一个为一趟,10个元素总共要比较9趟,因为不可能自己跟自己比较
for(int j=0;j<n-1-i;j++)
{//这里不断移动元素的位置,这里的边界是n-1-i,首先n-1就是因为不可能自己跟自己比较,那么-i是因为每完
//成一趟排序,就会将比较数组中的最大的元素放在比较数组的最后,那么可以发现每排序一次就会得到一个较大值,那么也就是每完成一趟排序,就多了一个排列好顺序的元素,那么下一趟也就不需要再次对上次已经排列好的元素再次进行比较,只需要对剩下的元素进行排序,也就是-i
if(arr[j]>arr[j+1])
{//满足条件交换元素
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
交换排序
相比冒泡排序,我觉得交换排序更加简单,更加容易理解,它是一种每个元素都和所有元素互相比较的方法,遇到比它小的元素,就互换位置 图示:
int *exchange(int *arr,int n)
{
printf("现在输入数据:\n");
for(int i=0;i<n;i++)//数组输入数据
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++)//i表示的是前面的一个元素,因此前面一个元素的边界也只可能是倒数第二个元素
{
for(int j=i+1;j<n;j++)//j代表的后面的一个元素,他的边界可以事最后一个元素
{
if(arr[i]>arr[j])
{//满足条件交换位置
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
插入排序
插入排序其实与前两种也差不多,需要注意的就是一个key值 每次都会选择一个元素作为key值, 从靠近自己左边的第一个元素开始比较,如果比key值大,并且没有越界,那么就将key值前面的元素向后移动,直到遇到比key值小的元素,那么那key值就放在比他小的元素的右边一个位置,以此类推
int *inserts(int *arr,int n)
{
int i,j,key;
printf("现在输入数据:\n");
for(int i=0;i<n;i++)//数组输入数据
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
{
key=arr[i];
j=i-1;
while(j>=0&&arr[j]>key)
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=key;
}
return arr;
}
选择排序
每次排序的时候都会设置一个key值,然后将key值分别和它后面的元素相比较,如果发现比它大的,就将key值重新设置为比它大的的元素的下标,最后如果key的值和刚开始设置的值是一样的,则不用交换,否则如果发现不一样,则不是最大值,需要将元素互换位置。
int selects(int *arr,int n)
{
int i,j,key;
printf("现在输入数据:\n");
for(int i=0;i<n;i++)//数组输入数据
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++)
{
key=i;
for(int j=i+1;j<n;j++)
{
if(arr[j]>arr[key])
key=j;
if(key!=i)
{
int temp=arr[i];
arr[i]=arr[key];
arr[key]=temp;
}
}
}
}