排序

来源:互联网 发布:郑州淘宝抓了人员名单 编辑:程序博客网 时间:2024/04/29 09:19


  1. int a[10];
  2. n=10;
  3. ------------------------------------------------
  4. //直接插入排序
  5. void InsertSort(int*a, int n)//下标从0开始。
  6. {
  7.     int i;
  8.     for(i=1;i<n;i++)
  9.     {
  10.         int j=i-1;
  11.         int temp=a[i];
  12.         while((a[j]>temp)&&(j>=0))
  13.         {
  14.             a[j+1]=a[j];
  15.             j--;
  16.         }
  17.         a[j+1]=temp;
  18.     }
  19.     for(i=0;i<n;i++)
  20.         printf("%d,",a[i]);
  21.     putchar('\n');
  22. }

  23. void InsertSortx(int*a, int n)//下标从1开始。
  24. {
  25.     int i;
  26.     for(i=2;i<n;i++)
  27.     {
  28.         int j=i-1;
  29.         a[0]=a[i];
  30.         while((a[j]>a[0])&&(j>=1))
  31.         {
  32.             a[j+1]=a[j];
  33.             j--;
  34.         }
  35.         a[j+1]=a[0];
  36.     }
  37.     for(i=1;i<n;i++)
  38.         printf("%d,",a[i]);
  39.     putchar('\n');
  40. }

  41. ------------------------------------------------
  42. //折半插入排序
  43. void BinaryInsertSort(int* a,int n)//下标从0开始。
  44. {
  45.     int i;
  46.     int j;
  47.     for(i=1;i<n;i++)
  48.     {
  49.     
  50.         int low=0;
  51.         int high=i-1;
  52.         int temp=a[i];
  53.         if(a[i]>=a[i-1])
  54.             continue;
  55.         while(low<=high)
  56.         {
  57.             int mid=(low+high)/2;
  58.             if(a[mid]>a[i])
  59.                 high=mid-1;
  60.             else
  61.                 low=mid+1;
  62.         }
  63.         for(j=i-1;j>=low;j--)
  64.         {
  65.             a[j+1]=a[j];
  66.         }
  67.         a[low]=temp;    
  68.     }
  69.     for(i=0;i<n;i++)
  70.         printf("%d,",a[i]);
  71.     putchar('\n');    
  72. }

  73. void BinaryInsertSortx(int* a,int n)//下标从1开始。
  74. {
  75.     int i;
  76.     int j;
  77.     for(i=2;i<n;i++)
  78.     {
  79.         int low=1;
  80.         int high=i-1;
  81.         if(a[i]>=a[i-1])
  82.             continue;
  83.         a[0]=a[i];
  84.         while(low<=high)
  85.         {
  86.             int mid=(low+high)/2;
  87.             if(a[mid]>a[i])
  88.                 high=mid-1;
  89.             else
  90.                 low=mid+1;
  91.         }
  92.         for(j=i-1;j>=low;j--)
  93.         {
  94.             a[j+1]=a[j];
  95.         }
  96.         a[low]=a[0];
  97.     }
  98.     for(i=1;i<n;i++)
  99.         printf("%d,",a[i]);
  100.     putchar('\n');    
  101. }

  102. ------------------------------------------------
  103. //选择排序
  104. void SelectSort(int*a,int n)//从下标0开始。
  105. {
  106.     int i;
  107.     int k;
  108.     int j;
  109.     for(i=0;i<n-1;i++)
  110.     {
  111.         k=i;
  112.         for(j=i+1;j<n;j++)
  113.         {
  114.             if(a[j]<a[k])
  115.                 k=j;
  116.         }
  117.         if(i!=k)
  118.         {
  119.             a[i]+=a[k];
  120.             a[k]=a[i]-a[k];
  121.             a[i]=a[i]-a[k];
  122.         }
  123.     }
  124.     for(i=0;i<n;i++)
  125.         printf("%d,",a[i]);
  126.     putchar('\n');
  127. }

  128. void SelectSortx(int*a,int n)//从下标1开始。
  129. {
  130.     int i;
  131.     int k;
  132.     int j;
  133.     for(i=1;i<n-1;i++)
  134.     {
  135.         k=i;
  136.         for(j=i+1;j<n;j++)
  137.         {
  138.             if(a[j]<a[k])
  139.                 k=j;
  140.         }
  141.         if(i!=k)
  142.         {
  143.             a[i]+=a[k];
  144.             a[k]=a[i]-a[k];
  145.             a[i]=a[i]-a[k];
  146.         }
  147.     }
  148.     for(i=1;i<n;i++)
  149.         printf("%d,",a[i]);
  150.     putchar('\n');
  151. }

  152. ------------------------------------------------
  153. //冒泡排序
  154. void BubbleSort(int*a,int n)//下标从0开始
  155. {
  156.     int i;
  157.     int j;
  158.     for(i=0;i<n-1;i++)//n-1趟
  159.     {
  160.         for(j=0;j<n-i-1;j++)
  161.         {
  162.             if(a[j]>a[j+1])
  163.             {
  164.                 a[j]+=a[j+1];
  165.                 a[j+1]=a[j]-a[j+1];
  166.                 a[j]=a[j]-a[j+1];
  167.             }
  168.         }
  169.     }
  170.     for(i=0;i<n;i++)
  171.         printf("%d,",a[i]);
  172.     putchar('\n');
  173. }

  174. void BubbleSortx(int*a,int n)//下标从1开始
  175. {
  176.     int i;
  177.     int j;
  178.     for(i=0;i<n-2;i++)//n-2趟
  179.     {
  180.         for(j=1;j<n-i-1;j++)
  181.         {
  182.             if(a[j]>a[j+1])
  183.             {
  184.                 a[j]+=a[j+1];
  185.                 a[j+1]=a[j]-a[j+1];
  186.                 a[j]=a[j]-a[j+1];
  187.             }
  188.         }
  189.     }
  190.     for(i=1;i<n;i++)
  191.         printf("%d,",a[i]);
  192.     putchar('\n');
  193. }

  194. ------------------------------------------------
  195. //堆排序,从下标1开始。
  196. void Sift(int i,int n)//i为根节点,n为数组最大下标
  197. {
  198.     
  199.     int k=2*i;//左孩子结点
  200.     a[0]=a[i];
  201.     while(k<=n)
  202.     {
  203.         if((k<n)&&(a[k]<a[k+1]))
  204.             k++;
  205.         if(a[0]<a[k])
  206.         {
  207.             a[i]=a[k];
  208.             i=k;
  209.             k=2*i;
  210.         }
  211.         else
  212.             k=n+1;
  213.     }
  214.     a[i]=a[0];
  215. }
  216. void HeapSort(int*a,int n)//n为数组的大小,即0~ n-1
  217. {
  218.     int i;
  219.     for(i=(n-1)/2;i>=1;i--)//初始建堆
  220.         Sift(i,n-1);
  221.     for(i=n-1;i>=2;i--)
  222.     {
  223.         a[0]=a[1];//交换a[1]和a[i]
  224.         a[1]=a[i];
  225.         a[i]=a[0];

  226.         Sift(1,i-1);
  227.     }
  228.     for(i=1;i<n;i++)
  229.     {
  230.         printf("%d,",a[i]);
  231.     }
  232.     putchar('\n');
  233. }

  234. ------------------------------------------------
  235. //快速排序
  236. int Partition(int i,int j)
  237. {
  238.     a[0]=a[i];
  239.     while(i<j)
  240.     {
  241.         while((i<j)&&(a[0]<=a[j]))
  242.             j--;
  243.         if(i<j)
  244.         {
  245.             a[i]=a[j];
  246.             i++;
  247.         }
  248.         while((i<j)&&(a[0]>=a[i]))
  249.             i++;
  250.         if(i<j)
  251.         {
  252.             a[j]=a[i];
  253.             j--;
  254.         }
  255.     }
  256.     a[i]=a[0];
  257.     return i;
  258. }

  259. void QuickSort()
  260. {
  261.     struct{
  262.         int low;
  263.         int high;
  264.     }s[100];
  265.     int t=1;
  266.     int i;
  267.     int k;
  268.     s[t].low=1;
  269.     s[t].high=9;

  270.     do{
  271.         int i,j;
  272.         i=s[t].low;
  273.         j=s[t].high;
  274.         t--;
  275.         k=Partition(i,j);
  276.         if(k+1<j)
  277.         {
  278.             t++;
  279.             s[t].low=k+1;
  280.             s[t].high=j;
  281.         }
  282.         if(k-1>i)
  283.         {
  284.             t++;
  285.             s[t].low=i;
  286.             s[t].high=k-1;
  287.         }
  288.     }while(t>0);
  289.     for(i=1;i<10;i++)
  290.     {
  291.         printf("%d,",a[i]);
  292.     }
  293.     putchar('\n');

  294. }

  295. void QuickSortx(int* a,int low,int high)
  296. {
  297.     int i=low;
  298.     int j=high;
  299.     a[0]=a[i];
  300.     while(i<j)
  301.     {
  302.         while((i<j)&&(a[0]<=a[j]))
  303.             j--;
  304.         if(i<j)
  305.         {
  306.             a[i]=a[j];
  307.             i++;
  308.         }
  309.         while((i<j)&&(a[0]>=a[i]))
  310.             i++;
  311.         if(i<j)
  312.         {
  313.             a[j]=a[i];
  314.             j--;
  315.         }
  316.     }
  317.     a[i]=a[0];
  318.     if(low<i-1)
  319.         QuickSortx(a,low,i-1);
  320.     if(i+1<high)
  321.         QuickSortx(a,i+1,high);
  322. }

  323. ------------------------------------------------
  324. //2路归并排序
  325. void merge(int*r,int*s,int a,int b,int c)
  326. {
  327.     int i=a;
  328.     int j=b+1;
  329.     int k=a;
  330.     while((i<=b)&&(j<=c))
  331.     {
  332.         if(r[i]<r[j])
  333.             s[k++]=r[i++];
  334.         else
  335.             s[k++]=r[j++];
  336.     }
  337.     while(i<=b)
  338.     {
  339.         s[k++]=r[i++];
  340.     }
  341.     while(j<=c)
  342.     {
  343.         s[k++]=r[j++];
  344.     }
  345. }

  346. int mergepass(int*r,int*s,int m,int n)
  347. {
  348.     int i=1,j;
  349.     while(i+2*m-1<=n)
  350.     {
  351.         merge(r,s,i,i+m-1,i+2*m-1);
  352.         i=i+2*m;
  353.     }
  354.     if(i+m-1<n)
  355.         merge(r,s,i,i+m-1,n);
  356.     else
  357.         for(j=i;j<=n;j++)
  358.             s[j]=r[j];
  359.     return m*2;
  360. }
  361. void mergesort(int n)
  362. {
  363.     int m=1;
  364.     while(m<n)
  365.     {
  366.         m=mergepass(a,b,m,n);
  367.         m=mergepass(b,a,m,n);
  368.     }
  369. }

0 0
原创粉丝点击