数据结构 内排序

简介: 数据结构 内排序

内排序

第一题:直接选择排序

[问题描述]

设计一个用链表表示的直接选择排序算法,并用程序实现。

[输入]

待排序的个数n,以及待排序的元素值。

[输出]

n个由小到大排列的结果。

[存储结构]

链式存储。

[算法的基本思想]

直接选择排序:

算法说明:已知待排序初始序列用单链表存贮,头指针head指向第一个结点,从这个待排序列中找出最小结点,用r来指示。r以前为已排序序列,r以后为未排序序列。再从未排序序列中找出最小结点与r交换元素。反复执行这个过程,直到排好序。

#include<stdio.h>
#include<malloc.h>
#define NULL 0
typedef struct LNode{
  int value;
  struct LNode *next;
}LNode, *node;
void initLNode(node &head, int n){
  //创建链表 
  head = (node)malloc(sizeof(LNode)); //创建头指针 
  int i;
  node p;
  p = head;
  for(i = 0; i < n; i++){
    //中间结点创建 
    node q = (node) malloc(sizeof(LNode));
    printf("请输入排序元素:");
    scanf("%d", &q->value);
    p->next = q;
    p = q;
  }
  p->next = NULL; //尾指针设置 
}
void selectSort(node &head){
  //选择排序 
  int temp;
  node r; //用来记录第一个无序
  node q; //用来遍历 
  r = head->next;
  while(r->next != NULL){
    //判断r是否为尾结点
    q = r->next;
    //q为r后的无序序列 
    while(q != NULL){
      //找出无序序列中最小的元素  
      if(q->value < r->value){
        temp = q->value;
        q->value = r->value;
        r->value = temp;
      }
      q = q->next;
    }
    r = r->next;
  }
}
void show(node head){
  //遍历显示排序完成的链表 
  node p;
  p = head->next;
  while(p != NULL){
    printf("%d", p->value);
    p = p->next;
  }
}
int main(){
  printf("请输入要排序的个数:");
  int n;
  scanf("%d", &n);
  node head;
    initLNode(head, n);
    selectSort(head);
    show(head);
}

结构演示:

image.png

结果与分析:

优点:通过交换数据而不是移动指针实现简单选择排序,缺点:时间复杂度较高,不具有稳定性,时间复杂度O(n²),空间复杂度O(n)n为待排序的个数

第二题:快速排序

[问题描述]

对N个关键字取整数的记录进行整序,以使所有关键字为非负数的记录排在关键字为负数的记录之前,要求使用最少的附加空间,且算法的时间复杂度为O(N)。

[输入]

待排序的个数n,以及待排序的元素值。

[输出]

n个数,负数在前,非负数在后。

[存储结构]

顺序存储。

[算法的基本思想]

交换排序(快速排序)。

算法说明:使用0作为枢纽进行一次划分,小于0即负数移动到数组的左边,大于0,移动到数组的右边,只需对数组进行一次遍历,时间复杂度为N。

#include<stdio.h>
void swap(int num[], int n){
  int low = 1; //双下标,遍历数组 
  int high = n;
  while(low < high){
    //high与low轮番移动
    //while中的两个while需要时刻满足外层while的条件 
    while(num[high] > 0 && low < high){
      //先移动high 
      high--;
    }
    num[0] = num[high];
    while(num[low] < 0 && low < high){
      low++;
    }
    num[high] = num[low];
    num[low] = num[0];
  }
}
int main(){
  printf("请输入数组规模:");
  int n;
  scanf("%d", &n);
  int num[n + 1]; //n[0]作为辅助空间 
  int i;
  for(i = 1; i <= n; i++){
    printf("请输入数据:");
    scanf("%d", &num[i]);
  }
  swap(num, n);
  for(i = 1; i <= n; i++){
    printf("%d ", num[i]);
  }
}

结构演示:

image.png

结果与分析:

优点:时间复杂度底,缺点:不具有稳定性,时间复杂度O(n),空间复杂度O(n)n为待排序的个数

心得

  1. 通过链表的选择排序:可只交换数据而不是移动指针实现简单选择排序
  2. 单次交换排序,可以进行元素的划分


目录
相关文章
|
2月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
34 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
2月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
29 1
|
2月前
|
搜索推荐 索引
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(二)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
2月前
|
搜索推荐 C++
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(一)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
2月前
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
05_用一个栈实现另一个栈的排序
05_用一个栈实现另一个栈的排序
|
2月前
|
人工智能 搜索推荐 算法
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(三)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
4月前
|
C语言
数据结构——排序【上】
数据结构——排序【上】
|
4月前
|
搜索推荐 算法 测试技术
【数据结构】排序
【数据结构】排序
|
5月前
|
搜索推荐
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】