zoukankan      html  css  js  c++  java
  • 简单的排序

    #include<stdio.h>

    #include<stdlib.h>

    #define N 20

    //冒泡排序
    void bubble(int a[],int n)
    {
      int j,i,temp;
     
      for (i = 0; i < n; i++)

        for (j =n-1; j > i; j--)

        {
          if (a[j] < a[j-1])

          {
             temp = a[j];

             a[j] = a[j-1];

             a[j-1] = temp;
          }
        }
    }
    //交换排序
    void exchange(int a[],int n)
    {
      int i,j,temp;

      for (i = 0;i < n; i++)

        for (j =i+1; j < n; j++)

        {
          if (a[i] > a[j])
     
          {
             temp = a[i];

             a[i] = a[j];

             a[j] = temp;
          }
        }
    }
    //选择排序
    void selectsort(int a[],int n)
    {
       int i,j,k,temp;

       for (i = 0; i <n; i++)
       {
         k = i;
     
         for (j = i+1; j < n; j++ )
     
         {
            if (a[i] > a[j])
               
                k = j;
         }
        
         if (k != i)
     
         {
            temp = a[i];

            a[i] = a[j];

            a[j] = temp;
         }
       }
    }
    //插入排序
    void insert(int a[], int n)
    {
      int i,j,temp;

      for (i = 1; i < n; i++)
      {
        j=i-1;
        
        temp = a[i];
     
        while (j >= 0 &&temp < a[j])

        {
           a[j+1] = a[j];
       
           j--;
        }

        a[j+1] = temp;
      }
    }

    //快速排序
    void run(int a[],int left,int right)
    {
      int i,j,temp,mid;

      i = left;

      j = right;

      mid = a[(left+right)/2];
     
      do{

        while (i < right &&a[i] < mid) //从左扫描大于中值的数

          i++;

        while (j > right &&a[j] > mid)//从右扫描小于中值的数

          j--;

        if (i <= j) //找到一对进行交换,并改变i , j
       
        {
           temp = a[i];

           a[i] = a[j];

           a[j] = temp;

           i++;

           j--;
        }

      }while (i<= j);//完成一次扫描

      if (left < j) //如果左部有值,递归扫描左部
     
      {
       run(a,left,j);
      }

      if (i <right)//如果右部有值,递归扫描右部

      {
       run(a,i,right);
      }
    }

    void quicksort(int a[],int n)
    {
      run(a,0,n-1);
    }
    //希尔排序
    void shell(int a[],int n)

    {
      int step[4] = {9,5,3,1};

      int i,j,temp,k,s,w;

      for (i = 0; i < 4; i++)

      {
        k =step[i];
       
      //  s = -k;

        for (j = k;j < n; j++)

        {
          temp = a[j];

          w = j-k;

       

          while (temp < a[w]&& w >= 0&& w <= n)

          {
             a[w+k] = a[w];
     
             w = w-k;
          }

          a[w+k] = temp;
        }
      }
    }

    void print(int a[],int n)
    {
      int i;

      for (i = 0; i < n; i++)
        
       printf("%-5d",a[i]);
     
      printf("\n");
    }
    void main()
    {
      int a[20],i;

      for (i = 0; i < 20; i++)

        a[i] = rand()%100+1;
     
      print(a,N);

      printf("冒泡排序后\n");
     
      bubble(a,N);

      print(a,N);

      printf("重新初始化后的数据\n");

      for (i = 0; i < 20; i++)

        a[i] = rand()%100+1;

      print(a,N);

      printf("交换排序后\n");

      exchange(a,N);

      print(a,N);

      printf("重新初始化后的数据\n");

      for (i = 0; i < 20; i++)

        a[i] = rand()%100+1;

      print(a,N);

      printf("选择排序后\n");
     
      selectsort(a,N);

      print(a,N);

      printf("重新初始化后的数据\n");

      for (i = 0; i < 20; i++)

        a[i] = rand()%100+1;

      print(a,N);

      printf("插入排序后\n");

      insert(a,N);

      print(a,N);

      printf("重新初始化后的数据\n");

      for (i = 0; i < 20; i++)

        a[i] = rand()%100+1;

      print(a,N);

      printf("快速排序后\n");

      quicksort(a,N);

      print(a,N);

      printf("重新初始化后的数据\n");

      for (i = 0; i < 20; i++)

        a[i] = rand()%100+1;

      print(a,N);

      printf("希尔排序后\n");

      shell(a,N);

      print(a,N);
    }

    虽然这几种是简单的排序,但是有时候还是会混淆,更复杂的排序算法,用到的时候再看,起码简单的要熟悉

  • 相关阅读:
    WPF控件模型
    WPF布局之Canvas
    WPF布局之Grid
    WPF布局之Panel
    cxGrid让指定的某行自动呈选选中的状态
    VMware Esxi5.5中嵌套虚拟机的网络设置方法
    SQLServer (2005/2008) 日志清理方法
    控制cxGrid 主从表的明细只展开一个
    关于Delphi cxGrid主从表中从表只能编辑第一条记录的问题
    自动化工程师面试常见问题
  • 原文地址:https://www.cnblogs.com/276815076/p/1795948.html
Copyright © 2011-2022 走看看