六个排序算法

直接插入法
官方解释:直接插入位置的确定方法是将待插入的记录与有序区中的各记录自右向左一次比较其关键字值得大小
自我理解:直接排序法原理是通过监视哨与前一个对比如果前一位的数据大于监视哨的数据
数据进行右移
算法最大趟数45 n(n-1)/2
adjfkalsf
直接插入排序法
通过arr[0]进行监视哨
#include<stdio.h> int main() { int arr[11] = { 0,25,12,36,45,2,9,39,22,98,37 }; int i, j, k; for (k = 1; k < 11; k++) { printf("%d ", arr[k]); } printf(" "); for (i = 2; i <= 10; i++) { arr[0] = arr[i];//对监视哨进行数据赋值 printf("a[0]%d ", arr[0]); j = i - 1; while (arr[0] < arr[j])//进行与监视哨进行比较如果监视哨小于前一位则后面元素后移 { arr[j + 1] = arr[j]; j--; } printf(" "); for (k = 1; k < 11; k++) { printf("%d ", arr[k]); } printf(" "); arr[j + 1] = arr[0]; } printf(" "); for (k = 1; k < 11; k++) { printf("%d ", arr[k]); } return 0; }
希尔排序法
官方解释:希尔排序是在直接插入排序的基础上做的改进,也就是将要排序的序列按固定增量分为若干组,等距离者在同一组中,然后再在组内进行直接插入排序。
个人理解:就是设置一步的跨度,然后慢慢缩小步的跨度,最后步跨度为1。
算法最大趟数:13
相比直接插入排序运行的次数变得少提高效率,而且距离=数据总数/2这样的步距时算法躺数最少。
#include<stdio.h>
int main()
{
    int arr[11] = { 0,25,12,36,45,2,9,39,22,98,37 };
    int i, j, k;
    int f;
    for (k= 1; k < 11; k++)
    {
        printf("%d ", arr[k]);

    }
    printf(" ");
    k = 10 / 2;
    while (k >= 1) {
        
        for (i=k+1;i<=10;i++)
        {
            arr[0] = arr[i];
            
            j = i - k;
            while ((j>0)&&(arr[0] < arr[j]))
            {

                arr[j + k] = arr[j];
        
                j=j-k;
            }    
        
            arr[j + k] = arr[0];
            
        }
        k = k / 2;

    }    for (k = 1; k < 11; k++)
    {
        printf("%d ", arr[k]);

    }    printf(" ");
    return 0;
}
冒泡排序法
官方解释:如果要对n个数进行冒泡排序,那么要进行n-1趟比较,在第一趟中要进行n-1次的两两比较在j趟比较中要进行n-j次两两比较。
个人理解:通过两两比较,进行数据置换。最大值会被沉底所以在之后的比较中不用进行比较,所以在j趟中进行n-j趟比较
最大趟数:45 n(n-1)/2
冒泡排序法
void main()
{  int i,j,t,a[11]={ 0,25,12,36,45,2,9,39,22,98,37 };
    for(i=1;i<10;i++)
      for(j=1;j<11-i;j++)
        if(a[j]>a[j+1})
         { t=a[j];
          a[j]=a[j+1];
          a[j+1];
         }
  printf("排序后的顺序是: ");
  for(i=1;i<=10;i++)
  printf("%5d",a[i]);
}

快速排序法
void qusort(int s[],int start,int end)
{
  int i,j;
  i=start;
  j=end;
  s[0]=s[start];//设置基准值
while(i<j)
{
    while(i<j&&s[0]<s[j])j--;
    if(i<j)
    {
      s[i]=s[j];
      i++
    }
  while(i<j%%s[i]<=s[0])
  i++;
  
  if(i<j)
  {
     s[j]=s[i];//大于基准值得是s【j】放到是s[i]中
    j--;
  }
}
  s[i]=s[0];
  if(start<i)
     qusort(s,start,j-1);
  if(i<end)qusort(s,j+1,end);
}

选择排序
相比于冒泡排序速度要快一些时间复杂度相同

  

  #include <stdio.h>
  int len(char arr[]){
  int i = 0;
  while(arr[i]>0){
    i++;
  }
    return i;
  }

  void show(char arr[]){
    for (int i = 0;i<len(arr) ;i++ )
    {
      printf("%c ",arr[i]);
    }
    printf(" ");
  }

  void selectionSort(char arr[]){

  char t = ' ';
  for(int i = 0; i < len(arr); i++){
    for(int j = i+1; j<len(arr); j++){
      if (arr[i]>arr[j])
      {
        t=arr[i];
        arr[i] = arr[j];
        arr[j] = t;
      }
    }
  }
}

int main(int argc, char *argv[])
{
  char c[5] = {'5','3','6','2'};
  show(c);
  selectionSort(c);
  show(c);
  return 0;
}

原文地址:https://www.cnblogs.com/qxhn/p/6119880.html