### 数据结构中的几种排序算法详解 #### 一、选择排序(Selection Sort) **定义与原理:** 选择排序是一种简单直观的比较排序算法。其工作原理是每次从未排序的部分选取最小(或最大)的元素,存放到序列的起始位置。在实现上,选择排序将待排序的数据划分为已排序部分和未排序部分。初始时已排序部分为空,未排序部分为全部数据。算法每次从未排序部分中找出最小(或最大)元素放入已排序部分的末尾,直至所有元素均被排序。 **代码解析:** ```cpp template<typename T> void selectionSort(vector<T>& a) { int num = a.size(); T temp; int p, i; for (i = 0; i < num; i++) { p = i; for (int j = i + 1; j < num; j++) { if (a[j] < a[p]) p = j; } if (p > i) { temp = a[i]; a[i] = a[p]; a[p] = temp; } } } ``` - 这段代码实现了模板化的选择排序算法。 - 使用两个嵌套循环进行遍历,外层循环用于确定当前需要放置的位置,内层循环用于找到当前位置之后的最小值。 - 找到最小值后,如果该最小值的位置不在当前要放置的位置,则进行交换。 #### 二、冒泡排序(Bubble Sort) **定义与原理:** 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数组列表,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数组的工作是重复地进行直到没有再需要交换,也就是说该数组已经排序完成。 **代码解析:** ```cpp template<typename T> void bubbleSort(vector<T>& a) { int num = a.size(); T temp; bool flag = false; for (int i = 0; i < num - 1; i++) { flag = false; for (int j = 0; j < num - i - 1; j++) { if (a[j] > a[j + 1]) { flag = true; temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } if (!flag) break; } } ``` - 冒泡排序的实现同样采用了模板化的方法。 - 外层循环控制比较轮次,内层循环进行相邻元素之间的比较和交换。 - 添加了一个`flag`标志变量来检测是否发生过交换,如果没有则提前结束排序过程。 #### 三、快速排序(Quick Sort) **定义与原理:** 快速排序是一种非常高效的排序算法,它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 **代码解析:** ```cpp template<typename T> void quickSort(vector<T>& a, int l, int r) { if (l < r) { int q = partition(a, l, r); quickSort(a, l, q - 1); quickSort(a, q + 1, r); } } template<typename T> int partition(vector<T>& a, int l, int r) { T temp = a[l], t; int i = l, j = r + 1; while (true) { while (a[++i] < temp && i <= r); while (a[--j] > temp); if (i >= j) break; t = a[i]; a[i] = a[j]; a[j] = t; } a[l] = a[j]; a[j] = temp; return j; } ``` - 快速排序的核心在于分区操作,通过一个基准值将数组分成两个部分,左边小于基准值,右边大于基准值。 - 分区操作完成后,递归地对左右两个子数组进行同样的处理。 - `partition`函数用于实现分区操作,返回基准值所在的位置。 #### 四、归并排序(Merge Sort) **定义与原理:** 归并排序是建立在归并操作上的一种有效的排序算法,效率为O(n log n)。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 **代码解析:** ```cpp template<typename T> void mergeSort(vector<T>& a, vector<T>& tmpArray, int l, int r) { if (l < r) { int center = (l + r) / 2; mergeSort(a, tmpArray, l, center); mergeSort(a, tmpArray, center + 1, r); merge(a, tmpArray, l, center + 1, r); } } template<typename T> void mergeSort(vector<T>& a) { vector<T> tmpArray(a.size()); mergeSort(a, tmpArray, 0, int(a.size() - 1)); } template<typename T> void merge(vector<T>& a, vector<T>& tmpArray, int l, int center, int r) { int i = l, j = center; int k = l; while (i < center && j <= r) { if (a[i] < a[j]) tmpArray[k++] = a[i++]; else tmpArray[k++] = a[j++]; } while (i < center) tmpArray[k++] = a[i++]; while (j <= r) tmpArray[k++] = a[j++]; for (i = l; i <= r; i++) { a[i] = tmpArray[i]; } } ``` - 归并排序首先将原始数组分解成尽可能小的单位,然后逐步合并这些单位。 - 在合并的过程中,通过比较元素大小来实现排序。 - 为了提高性能,这里使用了临时数组`tmpArray`来进行合并操作,避免了频繁的数据复制。 #### 总结 以上四种排序算法都是数据结构中最常用的排序算法之一,它们各自有优缺点,在实际应用中需要根据具体情况选择合适的排序算法。例如,对于小规模数据集,可以选择冒泡排序或选择排序;对于大规模数据集,快速排序和归并排序会更加高效。理解这些排序算法的原理和实现细节对于掌握数据结构和算法设计非常重要。
#include<ctime>
#include<vector>
#include<cstdlib>
#include<fstream>
#include "windows.h "
#include<stdlib.h>
using namespace std;
template<typename T>
void selectionSort(vector<T> &a)
{
int num=a.size();
T temp;
int p,i;
for(i=0;i<num;i++)
{
p=i;
for(int j=i+1;j<num;j++)
{
if(a[j] < a[p]) p=j;
}
if(p > i)
{
temp=a[i];
a[p]=temp;
}
}
}
template<typename T>
void bubbleSort(vector<T> &a)
{
int num=a.size();
T temp;
bool flag=false;
for(int i=0;i<num-1;i++)
{
flag=false;
for(int j=0;j<num-i-1;j++)
{
if(a[j] > a[j+1])
{
flag=true;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
if(flag==false) break;
}
剩余6页未读,继续阅读
- 粉丝: 21
- 资源: 19
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助