排序算法(一)

来源:互联网 发布:虚拟网络的功能和作用 编辑:程序博客网 时间:2024/05/21 09:07

这几天把以前学的一些算法整理了下,不知道从哪里开始,就找排序算法好了……

所谓排序,就是要整理数组中的记录,使之按关键字递增(递减)次序排列起来。

准确的定义:

      输入:n个记录R1,R2,R3,...Rn,其对应的关键字分别为k1,k2,k3,...,kn

      输出:Ri1,Ri2,Ri3,...Rin,使得ki1<=,ki2<=,ki3<=,...,<=kin(或ki1>=,ki2>=,ki3>=,...,>=kin)。

插入排序:

      插入排序(Insertion sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子数组中的适当位置,知道全部记录插入完全为止。

      直接插入排序和希尔(Shell)排序都属于插入排序。

直接插入排序:

     直接插入排序是稳定的排序方法。插入排序的基本思想是假设待排序的记录存在数组R[1...n]中。初始时,R[1]为有序区,R[2...n]为无序区,从i=2开始到i=n结束,一次将R[i]插入到当前有序区R[1...i-1]中,生成n个记录的有序区。

      1、在有序区R[1...i-1]中查找比较确定R[i]的插入位置k(1<=k<=i-1)

      2、将R[k...i-1]中的记录后移一位,空出k位置上的空间插入R[i]

      改进: 比较操作和记录移动同时进行R[i]从右向左依次与有序区记录R[j](j=i-1,i-2,...,1)比较

      1、if R[j]>R[i] then R[j]后移一位

      2、if R[j]<=R[i] then 查找结束,(j+1)为R[i]的插入位置。

算法实现:

#include <stdio.h>
#include <stdlib.h>

void print_array(int* pData, int n)
{

      int i;
      for (i = 0; i < n; ++i)
     {
           printf("%d ", pData[i]);
      }
      printf("/n");
}

 

void insert_sort(int* pData, int n)
{
      int i, j, nTemp;
      for (i = 1; i < n; ++i)
      {
           nTemp = pData[i];
           for (j = i-1; j >= 0 && nTemp < pData[j]; --j)
           {
                pData[j+1] = pData[j];
           }
           pData[j+1] = nTemp;
      }
}

 

int main()
{
     int n, i;
     int* pData;
     while(printf("please input the num:/n") && 1 == scanf("%d", &n))
     {
           pData = (int *)malloc(n * sizeof(int));
           printf("please input the data to sort:/n");
           for (i = 0; i < n; ++i)
                scanf("%d", &pData[i]);
           printf("Before sorted:");
           print_array(pData, n);
           printf("After sorted:");
           insert_sort(pData, n);
           print_array(pData, n);
           free(pData);
     }
     return 0;
}

希尔(shell)排序:

      希尔(shell)排序基本思想:将要排序的一组数按某个增量d分成若干组,对每组中全部元素进行排序,然后用一个较小的增量对它进行再次分组,并对每个新组进行排序。当增量减到1时,整个要排序的数就被分成一组,排序完成。

      希尔排序是不稳定排序。

算法实现:

#include <stdio.h>
#include <stdlib.h>

void print_array(int* pData, int n)
{

      int i;
      for (i = 0; i < n; ++i)
     {
           printf("%d ", pData[i]);
      }
      printf("/n");
}

 

void shell_sort(int* pData, int n)
{
      int d, i, j, nTemp;
      for (d = n/2; d > 0; d/=2)
      {
           for (i = d; i < n; ++j)
           {

                nTemp = pData[i];

                for (j = i-d; j>=0 && nTemp<pData[j]; j-=d)

                {

                      pData[j+d] = pData[j];

                 }
                pData[j+d] = nTemp;
           }
      }
}

 

int main()
{
     int n, i;
     int* pData;
     while(printf("please input the num:/n") && 1 == scanf("%d", &n))
     {
           pData = (int *)malloc(n * sizeof(int));
           printf("please input the data to sort:/n");
           for (i = 0; i < n; ++i)
                scanf("%d", &pData[i]);
           printf("Before sorted:");
           print_array(pData, n);
           printf("After sorted:");
           shell_sort(pData, n);
           print_array(pData, n);
           free(pData);
     }
     return 0;
}     

 

 

原创粉丝点击