数据结构day8(排序补充和查找)

 所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。对于排序,我们首先要求其具有一定的稳定性,即当两个相同的元素同时出现于某个序列之中,则经过一定的排序算法之后,两者在排序前后的相对位置不发生变化。

排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。

排序就是把集合中的元素按照一定的次序排序在一起。一般来说有升序排列和降序排列2种排序,在算法中有8中基本排序:

(1)冒泡排序;

(2)选择排序;

(3)插入排序;

(4)希尔排序;

(5)归并排序

(6)快速排序

(7)基数排序;

(8)堆排序;

(9)计数排序;

(10)桶排序。

 排序算法的复杂度及稳定性分析

 

 

#include <stdio.h>

void sim_sort(int *a, int len) // 简单选择排序
{

  for (int i = 0; i < len - 1; i++)
  {
    int p = i;
    for (int j = i + 1; j < len; j++)
    {
      if (*(a + p) > *(a + j))
      {
        p = j;
      }
    }
    if (i != p)
    {
      int t = *(a + i);
      *(a + i) = *(a + p);
      *(a + p) = t;
    }
  }
}

void in_sort(int *a, int len) // 直接插入排序
{
  for (int i = 1; i < len; i++)
  {
    int p = i;
    int t = *(a + i);
    while (p > 0)
    {

      if (t < *(a + p - 1))
      {
        *(a + p) = *(a + p - 1);
      }
      else
      {
        *(a + p) = t;
        break;
      }
      p--;
    }
    if (p == 0)
    {
      *a = t;
    }
  }
}

void quick_sort(int *a, int low, int high) // 快速排序
{
  int k = a[low], l = low, h = high;
  while (low < high)
  {
    while (low < high && k <= a[high])
    {
      high--;
    }
    a[low] = a[high];
    while (low < high && k >= a[low])
    {
      low++;
    }
    a[high] = a[low];
  }
  int m;
  if (low == high)
  {
    a[low] = k;
    m = low;
  }
  if (l < m - 1)
  {
    quick_sort(a, l, m - 1);
  }
  if (m + 1 < h)
  {
    quick_sort(a, m + 1, h);
  }
}

void merger(int *a, int low, int high) // 归并排序{二路}
{
  if (low >= high)
  {
    return;
  }
  int mid = (high + low) / 2;
  merger(a, low, mid);
  merger(a, mid + 1, high);

  int b[high - low + 1];
  int i = 0;
  int l = low, h = high, m = mid;
  while (l <= mid && m + 1 <= high)
  {
    if (a[l] <= a[m + 1] && l <= mid)
    {
      b[i++] = a[l++];
    }
    else if (a[l] > a[m + 1] && m + 1 <= high)
    {
      b[i++] = a[m + 1];
      m++;
    }
  }
  while (l <= mid)
  {
    b[i++] = a[l++];
  }
  while (m + 1 <= high)
  {
    b[i++] = a[m + 1];
    m++;
  }
  l = low;
  for (int j = 0; j < high - low + 1; j++)
  {
    a[l++] = b[j];
  }
}

void output(int *a, int len) // 输出
{
  for (int i = 0; i < len; i++)
  {
    printf("%d\t", a[i]);
  }
  puts("");
  printf("有%d个元素\n", len);
}

int half_search(int *a, int e, int low, int high) // 折半查找{需要在有序表里查找}
{
  int mid = (low + high) / 2;
  if (low <= high)
  {
    if (e < a[mid])
    {
      half_search(a, e, low, mid - 1);
    }
    else if (e > a[mid])
    {
      half_search(a, e, mid + 1, high);
    }
    else if (e = a[mid])
    {
      printf(" %d 在第 %d 个位置出现。\n", e, mid + 1);
      return mid;
    }
  }

  else
  {
    printf(" %d 未在表内出现。\n", e);
    return -1;
  }
}

void main()
{

  int a[] = {2, 37, 12, 13, 34, 7};
  int len = sizeof(a) / sizeof(a[0]);
  output(a, len);

  int high = len - 1;
  int low = 0;
  // quick_sort(a,low,high);      //快速排序

  merger(a, low, high); // 归并排序
  // in_sort(a,len);            //插入排序
  // sim_sort(a,len);           //选择排序
  output(a, len);

  int e;
  printf("输入你要查找的元素:");
  scanf("%d", &e);
  int p = half_search(a, e, low, high);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值