数据结构笔记--排序

排序;
1、插入排序(直接插入排序和希尔排序)
2、选择排序(直接选择排序和堆排序)
3、交换排序(冒泡排序和快速排序)
4、归并排序
5、基数排序

---------------------
直接插入排序
说明:逐个将后一个数加到前面的排好的序中。在直接插入排序过程中,对其中一个记录的插入排序称为一次

排序;直接插入排序是从第二个记录开始进行的,因此,长度为n的记录序列需要进行n-1次排序才能完成整个

序列的排序。时间复杂度为O(n2)。
void InsertSort(elemtype x[],int n)
/*用直接插入法对x[0]-x[n-1]排序*/
{
  int i,j;
  elemtype s;
  for(i=0;i<n-1;i++)
  {
    s=x[i+1];
    j=i;
    while(j>-1&&s.key<x[j].key)
    {
      x[j+1]=x[j];
      j--;
    }
    x[j+1]=s;
  }
}

---------------------
希尔排序
说明:希尔排序又称缩小增量排序,增量di可以有各种不同的取法,但最后一次排序时的增量必须为1,最简

单可取di+1=di/2(取小)。时间复杂度为O(n(log2n)2)。

void ShellSort(elemtype x[],int n,intd[],int Number)
/*用希尔排序法对记录x[0]-x[n-1]排序,d为增量值数组*/
/*Number为增量值个数,各组内采用直接插入法排序*/
{
  int i,j,k,m,Span;
  elemtype s;
  for(m=0;m<Number;m++)
  {
    Span=d[m];
    for(k=0;k<Span;k++)
    {
     for(i=k;i<n-1;i+=Span)/*这个for之后的是“组内采用直接插入法排序”*/
      {
       s=x[i+Span];
       j=i;
       while(j>-1&&s.key<x[j].key)
       {
         x[j+Span]=x[j];
         j-=Span;
       }
       x[j+Span]=s;
      }
    }
  }
}

----------------------------
直接选择排序
说明:每次将后面的最小的找出来插入前面的已排好的序中。同理,具有n个记录的序列要做n-1次排序。
时间复杂度为O(n2)。
void SelectSort(elemtype x[],int n)
/*用直接选择排序法对x[0]-x[n-1]排序*/
{
  int i,j,Small;
  elemtype Temp;
  for(i=0;i<n-1;i++)
  {
    Small=i;
    for(j=i+1;j<n;j++)
     if(x[j].key<x[Small].key)
       Small=j;
   
    if(Small!=i)
     {
       Temp=x[i];
       x[i]=x[Small];
       x[Small]=Temp; 
     }
  }
}

--------------------------
冒泡排序
说明:两个两个比较,将大的往后移。通过第一次冒泡排序,使得待排序的n个记录中关键字最大的记录排到

了序列的最后一个位置上。然后对序列中前n-1个记录进行第二次冒泡排序。。。对于n个记录的序列,共需进

行n次冒泡排序。时间复杂度为O(n2)。

void BubbleSort(elemtype x[],int n)
/*用冒泡排序法对x[0]-x[n-1]排序*/
{
  int i,j,flag=1;
  elemtype Temp;
  for(i=1;i<n&&flag==1;i++)
  {
    flag=0;
    for(j=0;j<n-i;j++)
    {
      if(x[j].key>x[j+1].key)
       {
          flag=1;
          Temp=x[j];
          x[j]=x[j+1];
          x[j+1]=Temp;
       }
    }
  }
}

-----------------------------
快速排序
说明:又叫分区交换排序,是对冒泡排序方法的一种改进。时间复杂度为O(nlog2n)。

void QuickSort(elemtype x[],int low,int high)
/*用递归方法对记录x[0]-x[n-1]进行快速排序*/
{
  int i,j;
  elemtype Temp;

  i=low;
  j=high;
  Temp=x[low];

  while(i<j)
  {
    /*在序列的右端扫描*/
    while(i<j&&Temp.key<=x[j].key)j--;
    if(i<j)
    {
      x[i]=x[j];
      i++;
    }

    /*在序列的左端扫描*/
    while(i<j&&x[i].key<Temp.key)i++;
    if(i<j)
    {
      x[j]=x[i];
      j--;
    }
  } 
    x[i]=Temp;

   /*对子序列进行快速排序*/ 
   if(low<i-1)QuickSort(x,low,i-1);
   if(j+1<high)QuickSort(x,j+1,high);
}

-------------------------
归并排序
说明:所谓归并排序就是将两个或两个以上的有序数据序列合并成一个有序数据序列的过程。
时间复杂度为O(nlog2n)。

void merge(r,l,m,h,r1,r2)/*r[l,m]及r[m+1,h]分别有序,归并后置于r2中*/
sqlist r,r2;
int l,m,h;
{
  int i,j,k;
  k=l;/*k是r2的指示器,i、j分别为s1、s2的指示器*/
  i=l;
  j=m+1;

  while(i<=m&&j<=h)
  {
    if(r[i].key<=r[j].key)
     {
        r2[k]=r[i];
        i++;
     }
    else
     {
        r2[k]=r[j];
        j++;
     }
    k++;
  }
  if(i>m)  /*s1结束*/
   while(j<=h)
   {
    r2[k]=r[j];
    j++;k++;
   }
  else
   while(i<=m)
    {
      r2[k]=r[i];
      i++;k++;
    }
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供关于数据结构排序笔记。 内排序是指在排序过程中,所有待排序的数据元素全部存放在内存中进行排序。常见的内排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等。 1. 冒泡排序 冒泡排序是一种交换排序。它的基本思想是:通过交换相邻两个元素的位置,把大的元素往后面移动,小的元素往前面移动,从而实现排序的目的。 代码实现: ```c void bubble_sort(int arr[], int len) { for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { if (arr[j] > arr[j+1]) { swap(arr[j], arr[j+1]); } } } } ``` 2. 插入排序 插入排序是一种插入排序。它的基本思想是:将待排序的元素插入到已经排好序的序列中,从而得到一个新的、更大的有序序列。 代码实现: ```c void insertion_sort(int arr[], int len) { int i, j, tmp; for (i = 1; i < len; i++) { tmp = arr[i]; for (j = i; j > 0 && arr[j-1] > tmp; j--) { arr[j] = arr[j-1]; } arr[j] = tmp; } } ``` 3. 选择排序 选择排序是一种选择排序。它的基本思想是:每次从待排序的序列中选择一个最小的元素,放到已经排好序的序列的末尾,直到所有元素都排好序。 代码实现: ```c void selection_sort(int arr[], int len) { int i, j, min_idx; for (i = 0; i < len - 1; i++) { min_idx = i; for (j = i + 1; j < len; j++) { if (arr[j] < arr[min_idx]) { min_idx = j; } } swap(arr[i], arr[min_idx]); } } ``` 4. 快速排序 快速排序是一种分治排序。它的基本思想是:通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比另一部分的元素小,然后再对这两部分分别进行排序,直到整个序列排好序为止。 代码实现: ```c void quick_sort(int arr[], int l, int r) { if (l < r) { int i = l, j = r, x = arr[l]; while (i < j) { while (i < j && arr[j] >= x) j--; if (i < j) arr[i++] = arr[j]; while (i < j && arr[i] < x) i++; if (i < j) arr[j--] = arr[i]; } arr[i] = x; quick_sort(arr, l, i-1); quick_sort(arr, i+1, r); } } ``` 5. 归并排序 归并排序是一种分治排序。它的基本思想是:将待排序序列分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序序列。 代码实现: ```c void merge(int arr[], int l, int m, int r) { int i, j, k; int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1 + j]; i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k++] = L[i++]; } else { arr[k++] = R[j++]; } } while (i < n1) { arr[k++] = L[i++]; } while (j < n2) { arr[k++] = R[j++]; } } void merge_sort(int arr[], int l, int r) { if (l < r) { int m = (l + r) / 2; merge_sort(arr, l, m); merge_sort(arr, m+1, r); merge(arr, l, m, r); } } ``` 以上是内排序的几种常见算法。需要注意的是,不同的算法在不同的数据情况下,其效率也会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值