2. 冒泡排序算法、折半插入排序算法简单选择排序算法基本思想
时间: 2024-06-09 15:03:08 浏览: 146
1. 冒泡排序算法的基本思想是:比较相邻的两个元素,如果前一个元素比后一个元素大,就交换这两个元素的位置,一轮下来,最大的元素就会被交换到序列的末尾。然后再从头开始进行相邻元素的比较和交换,直到整个序列有序为止。时间复杂度为O(n^2)。
2. 折半插入排序算法的基本思想是:将待排序的序列分为有序和无序两部分,每次从无序部分取出第一个元素,在有序部分中采用折半查找的方式找到插入位置,将该元素插入到有序部分中合适的位置,直到整个序列有序为止。时间复杂度为O(n^2)。
3. 简单选择排序算法的基本思想是:在待排序的序列中选择最小的元素,将其放置在序列的起始位置,然后再从剩余的元素中选择最小的元素,将其放置在已排序序列的末尾。重复这个过程,直到整个序列有序为止。时间复杂度为O(n^2)。
相关问题
给出含有n个学生的成绩表 每条记录由学号 姓名 和分数组成 设计程序完成下列操作 设计一个菜单操作界面 该系统操作需要1.录入学生基本信息 2.直接插入排序 3.折半排序 4.冒泡排序 5.快速排序 6.简单选择排序 7.输出学生信息 8.退出
以下是一个C++程序,用于实现上述功能:
```c++
#include <iostream>
#include <string>
using namespace std;
struct Student {
string id; // 学号
string name; // 姓名
int score; // 分数
};
void insertSort(Student arr[], int n) {
int i, j;
Student key;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j].id > key.id) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
void binarySort(Student arr[], int n) {
int i, j, low, high, mid;
Student key;
for (i = 1; i < n; i++) {
key = arr[i];
low = 0;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (arr[mid].id > key.id) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
for (j = i - 1; j >= low; j--) {
arr[j + 1] = arr[j];
}
arr[low] = key;
}
}
void bubbleSort(Student arr[], int n) {
int i, j;
Student temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j].id > arr[j + 1].id) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int partition(Student arr[], int low, int high) {
Student pivot = arr[high];
int i = low - 1;
Student temp;
for (int j = low; j <= high - 1; j++) {
if (arr[j].id < pivot.id) {
i++;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return (i + 1);
}
void quickSort(Student arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void selectionSort(Student arr[], int n) {
int i, j, min_idx;
Student temp;
for (i = 0; i < n - 1; i++) {
min_idx = i;
for (j = i + 1; j < n; j++) {
if (arr[j].id < arr[min_idx].id) {
min_idx = j;
}
}
temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
void printStudents(Student arr[], int n) {
cout << "学号\t姓名\t分数" << endl;
for (int i = 0; i < n; i++) {
cout << arr[i].id << "\t" << arr[i].name << "\t" << arr[i].score << endl;
}
}
int main() {
int n = 0;
Student students[100];
int choice;
while (true) {
cout << "请选择操作:" << endl;
cout << "1. 录入学生基本信息" << endl;
cout << "2. 直接插入排序" << endl;
cout << "3. 折半排序" << endl;
cout << "4. 冒泡排序" << endl;
cout << "5. 快速排序" << endl;
cout << "6. 简单选择排序" << endl;
cout << "7. 输出学生信息" << endl;
cout << "8. 退出" << endl;
cin >> choice;
switch (choice) {
case 1:
cout << "请输入学生数目:";
cin >> n;
for (int i = 0; i < n; i++) {
cout << "请输入学生" << i + 1 << "的学号、姓名和分数:";
cin >> students[i].id >> students[i].name >> students[i].score;
}
break;
case 2:
insertSort(students, n);
cout << "直接插入排序完成!" << endl;
break;
case 3:
binarySort(students, n);
cout << "折半排序完成!" << endl;
break;
case 4:
bubbleSort(students, n);
cout << "冒泡排序完成!" << endl;
break;
case 5:
quickSort(students, 0, n - 1);
cout << "快速排序完成!" << endl;
break;
case 6:
selectionSort(students, n);
cout << "简单选择排序完成!" << endl;
break;
case 7:
printStudents(students, n);
break;
case 8:
return 0;
default:
cout << "无效操作!" << endl;
break;
}
}
return 0;
}
```
该程序使用`struct`定义了一个名为`Student`的结构体,其中包含学号、姓名和分数三个属性。程序使用一个`while`循环来提供菜单操作界面,通过`switch`语句对用户的选择进行响应。对于每个排序算法,程序定义了一个相应的函数,用于对学生信息数组进行排序。`printStudents`函数用于输出学生信息。
python冒泡排序,直接插入排序,折半插入排序,简单选择排序,快速排序算法
好的,我来为您介绍这几种排序算法。
1. 冒泡排序:它是一种简单的排序算法,通过不断交换相邻的元素来将序列排序。具体来说,它每次比较相邻的两个元素,如果顺序不对就交换它们的位置。重复这个过程直到所有元素都排好序为止。时间复杂度为 O(n^2)。
2. 直接插入排序:它是一种稳定的排序算法,它每次将一个待排序的元素插入到已经排好序的序列中。具体来说,它从第二个元素开始,将其插入到已经排好序的前面的序列中。时间复杂度为 O(n^2)。
3. 折半插入排序:它是一种改进的直接插入排序算法,它通过二分查找的方式来寻找插入位置,从而减少了比较次数。具体来说,它将待排序的元素插入到已经排好序的序列中,但是它是通过二分查找来寻找插入位置的。时间复杂度为 O(n^2)。
4. 简单选择排序:它是一种简单的排序算法,它每次选择一个最小的元素,并将其放到已经排好序的序列的末尾。具体来说,它从第一个元素开始,找到最小的元素并将其放到第一个位置,然后从剩余的元素中找到最小的元素并将其放到第二个位置,以此类推。时间复杂度为 O(n^2)。
5. 快速排序:它是一种高效的排序算法,它通过分治的方式来将序列分成两个子序列,然后对这两个子序列分别进行排序。具体来说,它选择一个基准元素,将序列分成两个子序列,左边的子序列都比基准元素小,右边的子序列都比基准元素大。然后递归地对左右子序列进行快速排序。时间复杂度为 O(nlogn)。
阅读全文
相关推荐













