常见的一些排序

52 阅读2分钟

前言:

对于排序,也是想了很久,但是对于这几种排序,对于我来说,以下的一些思路以及实现方法更容易理解,不足之处,还望指出 感谢

冒泡排序

针对冒泡排序,我认为是相邻的两个元素相互比较,如果前面的元素比后面的元素大那么他们就互换 图示: image.png

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;
}

交换排序

相比冒泡排序,我觉得交换排序更加简单,更加容易理解,它是一种每个元素都和所有元素互相比较的方法,遇到比它小的元素,就互换位置 图示:

image.png

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值就放在比他小的元素的右边一个位置,以此类推

image.png

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;
     }
   }
 }
}