C语言十大经典排序算法(动态演示+代码,值得收藏)!

§ 时间、空间复杂度比较

排序算法平均时间复杂度最差时间复杂度空间复杂度数据对象稳定性

 

1、冒泡排序

算法思想

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序动图演示:

代码:

 

2、选择排序

算法思想

Ⅰ.  在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

Ⅱ.  从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾

Ⅲ.  以此类推,直到所有元素均排序完毕

 

选择排序动图演示:

代码:

 

3、插入排序

算法思想

从第一个元素开始,该元素可以认为已经被排序

取出下一个元素,在已经排序的元素序列中从后向前扫描

如果该元素(已排序)大于新元素,将该元素移到下一位置

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

将新元素插入到该位置后

重复步骤2~5

 

插入排序动图演示:

代码:

 

4、快速排序

算法思想

选取第一个数为基准

将比基准小的数交换到前面,比基准大的数交换到后面

对左右区间重复第二步,直到各区间只有一个数

 

快速排序动图演示:</

  • 3
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的C语言数据结构算法演示系统的代码示例,包括链表、栈、冒泡排序和二分查找算法的实现。 ```c #include <stdio.h> #include <stdlib.h> // 链表结构体 struct node { int data; struct node *next; }; // 栈结构体 struct stack { int top; int data[100]; }; // 初始化链表为空 struct node *head = NULL; // 初始化栈 void init_stack(struct stack *s) { s->top = -1; } // 判断栈是否为空 int is_empty(struct stack *s) { return s->top == -1; } // 判断栈是否已满 int is_full(struct stack *s) { return s->top == 99; } // 入栈操作 void push(struct stack *s, int x) { if (is_full(s)) { printf("Stack is full\n"); return; } s->data[++s->top] = x; } // 出栈操作 int pop(struct stack *s) { if (is_empty(s)) { printf("Stack is empty\n"); return -1; } return s->data[s->top--]; } // 初始化链表 void init_list() { head = NULL; } // 插入节点到链表头部 void insert_node(int x) { struct node *temp = (struct node*)malloc(sizeof(struct node)); temp->data = x; temp->next = head; head = temp; } // 删除节点 void delete_node(int x) { struct node *temp = head, *prev = NULL; while (temp != NULL && temp->data != x) { prev = temp; temp = temp->next; } if (temp == NULL) { printf("Node not found\n"); return; } if (prev == NULL) { head = temp->next; } else { prev->next = temp->next; } free(temp); } // 显示链表 void display_list() { struct node *temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } // 冒泡排序 void bubble_sort(int arr[], int n) { for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } // 二分查找 int binary_search(int arr[], int n, int x) { int left = 0, right = n - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == x) { return mid; } else if (arr[mid] < x) { left = mid + 1; } else { right = mid - 1; } } return -1; } int main() { int choice, x, pos, n, arr[100]; struct stack s; init_stack(&s); init_list(); while (1) { printf("1. Insert node to linked list\n"); printf("2. Delete node from linked list\n"); printf("3. Display linked list\n"); printf("4. Push element to stack\n"); printf("5. Pop element from stack\n"); printf("6. Bubble sort\n"); printf("7. Binary search\n"); printf("8. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: printf("Enter element to insert: "); scanf("%d", &x); insert_node(x); break; case 2: printf("Enter element to delete: "); scanf("%d", &x); delete_node(x); break; case 3: printf("Linked list: "); display_list(); break; case 4: printf("Enter element to push: "); scanf("%d", &x); push(&s, x); break; case 5: x = pop(&s); if (x != -1) { printf("Popped element: %d\n", x); } break; case 6: printf("Enter number of elements: "); scanf("%d", &n); printf("Enter elements: "); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } bubble_sort(arr, n); printf("Sorted array: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); break; case 7: printf("Enter number of elements: "); scanf("%d", &n); printf("Enter elements: "); for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } printf("Enter element to search: "); scanf("%d", &x); pos = binary_search(arr, n, x); if (pos == -1) { printf("Element not found\n"); } else { printf("Element found at position %d\n", pos + 1); } break; case 8: exit(0); default: printf("Invalid choice\n"); } } return 0; } ``` 以上代码是一个简单的C语言数据结构算法演示系统的示例,包括链表、栈、冒泡排序和二分查找算法的实现。你可以根据自己的需求和兴趣进行更多的扩展和改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值