目录
一、实验目的
二、实验原理
1.直接插入排序
2.快速排序
三、实验内容
实验1
代码
截图
实验2
代码
截图
一、实验目的
1、掌握排序的基本概念;
2.掌握并实现以下排序算法:直接插入排序、快速排序。
二、实验原理
1.直接插入排序
其基本思想是将一个待排序的元素插入到已经排好序的部分。
- 从第二个元素开始,将当前元素插入到已经排好序的序列中。
- 将当前元素依次与已排序序列中的元素比较,找到合适的位置插入。
- 重复以上步骤,直到所有元素都有序。
void insertion_sort(int arr[], int num) {
for (int i = 1; i < num; i++) {
int start = 0;//已排序好的数组中待排序的元素最后所在的位置
int end = i;//加上待排序的元素的数组的最后一个元素的位置
int temp = arr[i];
for (int j = i - 1; j >= 0; j--) {//从后往前找到已排序的数组中第一个比待排序元素小的位置
if (arr[i] > arr[j]) {
start = j+1;
break;
}
}
for (int i = end; i > start; i--) {//比待排序元素大的都后移
arr[i] = arr[i - 1];
}
arr[start] = temp;
}
return;
}
2.快速排序
其基本思想是选择一个基准元素,将数组划分为左右两个子数组,使得左边的元素都小于等于基准,右边的元素都大于等于基准,然后对左右子数组递归地应用快速排序。
选择基准元素(Pivot): 从数组中选择一个元素作为基准元素。通常选择数组中的最后一个元素。
划分阶段: 将数组中小于等于基准的元素放在基准的左侧,将大于等于基准的元素放在基准的右侧。这个过程称为划分(Partitioning)。
- 初始化两个指针,
i
指向数组的起始位置,j
指向数组的结束位置。- 从左到右找到第一个大于基准的元素,从右到左找到第一个小于基准的元素,交换它们的位置。
- 重复上述步骤,直到
i
大于等于j
。- 将基准元素与
i
所指位置的元素交换。递归排序: 对划分得到的两个子数组分别递归地应用快速排序。
- 对左侧子数组递归调用快速排序:
quick_sort(arr, low, pi - 1)
- 对右侧子数组递归调用快速排序:
quick_sort(arr, pi + 1, high)
合并结果: 在递归的最后阶段,数组会变得有序。整个过程重复直到整个数组排序完成。
//交换两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 根据基准元素将数组划分为两个子数组,并返回基准元素的位置
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
// 快速排序函数
void quick_sort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
// 递归地对左右子数组进行排序
quick_sort(arr, low, pi - 1);
quick_sort(arr, pi + 1, high);
}
}
三、实验内容
实验1
使用直接插入排序算法对序列{49,38,65,97,76,13,27,49}进行从小到大排序,并且输出每一趟排序的结果。
代码
#include<iostream>
using namespace std;
void insertion_sort(int arr[], int num) {
for (int i = 1; i < num; i++) {
int start = 0;//已排序好的数组中待排序的元素最后所在的位置
int end = i;//加上待排序的元素的数组的最后一个元素的位置
int temp = arr[i];
for (int j = i - 1; j >= 0; j--) {//从后往前找到已排序的数组中第一个比待排序元素小的位置
if (arr[i] > arr[j]) {
start = j+1;
break;
}
}
for (int i = end; i > start; i--) {//比待排序元素大的都后移
arr[i] = arr[i - 1];
}
arr[start] = temp;
for (int i = 0; i < 8; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
return;
}
int main() {
int arr1[8] = { 49,38,65,97,76,13,27,49 };
cout << "直接插入排序结果为" << endl;
insertion_sort(arr1, 8);
return 0;
}
截图
实验2
使用快速排序算法对序列{49,38,65,97,49,13,27,76}进行从小到大排序,并且输出每一趟排序的结果。
代码
#include<iostream>
using namespace std;
#include<iostream>
using namespace std;
//交换两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 根据基准元素将数组划分为两个子数组,并返回基准元素的位置
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
// 快速排序函数
void quick_sort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
for (int i = 0; i < 8; i++) {
cout << arr[i] << " ";
}
cout << endl;
// 递归地对左右子数组进行排序
quick_sort(arr, low, pi - 1);
quick_sort(arr, pi + 1, high);
}
}
int main() {
int arr1[8] = { 49,38,65,97,76,13,27,49 };
cout << "快速排序结果为" << endl;
quick_sort(arr1,0, 7);
return 0;
}