//=========================================快速排序==========================================
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型vector 待排序的数组
* @return int整型vector
*/
vector<int> MySort(vector<int>& arr)
{
// write code here
mySort1(arr);
return arr;
}
void mySort1(vector<int>& arr) {
quicksort(arr, 0, arr.size() - 1);
}
void quicksort(vector<int> &arr, int left, int right) {
if (left > right)
return;
int pivotIndex = partition(arr, left, right); // 标杆值所在的位置
quicksort(arr, left, pivotIndex - 1); // 左半边
quicksort(arr, pivotIndex + 1, right); // 右半边
}
int partition(vector<int> &arr, int left, int right) {
// 最后一个值当做标杆
int counter = left; // 记录小于标杆值的个数
while (left < right) {
if (arr[left] < arr[right]) { // 当前值和标杆值比较,决定是放在左边还是右边
swap(arr[left], arr[counter]);
counter++;
}
left++;
}
swap(arr[counter], arr[right]); // 最后把标杆值移到中间位置,然后返回下标。
return counter;
}
};
//=================================================堆排序=========================================
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型vector 待排序的数组
* @return int整型vector
*/
vector<int> MySort(vector<int>& arr)
{
// write code here
heapSort(arr);
return arr;
}
void heapSort(vector<int> &arr) {
priority_queue<int, vector<int>, greater<int>> q; //小顶堆构造
for (int i = 0; i < arr.size(); i++) {
q.push(arr[i]);
}
for (int i = 0; i < arr.size(); i++) {
arr[i] = q.top();
q.pop();
}
}
};
//==================================冒泡排序=====================================
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型vector 待排序的数组
* @return int整型vector
*/
vector<int> MySort(vector<int>& arr)
{
// write code here
bubblesort(arr);
return arr;
}
void bubblesort(vector<int> &arr) {
for (int i = 0; i < arr.size(); i++)
{
for (int j = i + 1; j < arr.size(); j++)
{
if (arr[j] < arr[i])
{
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
};
//================================================选择排序===================================
void selectsort(vector<int> &arr) {
for (int i = 0; i < arr.size(); i++)
{
int index = i; // 需要定义index
for (int j = i + 1; j < arr.size(); j++)
{
if (arr[j] < arr[index]) // 比较的不再是 i 和 j 。
{
index = j;
}
}
swap(arr[i], arr[index]); // for 内部实现 i 和 index 的交换
}
}
//=============================================直接插入========================================
void insetionSort(vector<int>& arr) {
int preIndex = 0;
int currentVal = 0;
for (int i = 1; i < arr.size(); i++) {
preIndex = i - 1;
currentVal = arr[i];
while (arr[preIndex] > currentVal) {
arr[preIndex + 1] = arr[preIndex];
preIndex--; //不知道为啥要 --
}
arr[preIndex + 1] = currentVal; //for 里面 ++ 后赋值
}
}
//==========================================希尔排序===========================================
void xierSort(vector<int>& arr) {
for (int gap = arr.size() / 2; gap > 0; gap /= 2)
{
for (int i = gap; i < arr.size(); i++)
{
int j = i;
while (j - gap >= 0 && arr[j] < arr[j - gap])
{
swap(arr[j], arr[j - gap]);
j -= gap;
}
}
}
}
排序 (快速排序、堆排序、冒泡排序、选择排序、直接插入、希尔排序)
最新推荐文章于 2022-03-25 11:32:09 发布
这篇博客深入探讨了五种经典的排序算法:快速排序、堆排序、冒泡排序、选择排序和插入排序。详细介绍了每种算法的实现原理和步骤,并提供了C++实现代码。通过比较这些排序算法的时间复杂度和性能,帮助读者理解不同排序算法的适用场景。
摘要由CSDN通过智能技术生成