快速排序核心思想
- 找一个参考点做中心轴;
- 将大于中心轴的数据放在中心轴的右边,小于中心轴的数据放在中心轴左边;
- 分别对中心轴左右子序列再进行1,2步的操作(即递归)
代码实现
自定义类型实现
#include<iostream>
#include<ctime>
#include<algorithm>
using namespace std;
int pivotIndex(int begin, int end, int* array)
{
//默认让第一个元素成为节点元素
int pivot = array[begin];
end--;
//快速排序
while (begin < end)
{
//从右向左扫描
while (begin < end)
{
//右边元素大于轴点元素
if (array[end] > pivot)
{
//右边元素索引左移
end--;
cout << end << endl;
}
//右边元素小于轴点元素
else
{
array[begin++] = array[end];
break;
}
}
//从左向右扫描
while (begin < end)
{
//左边元素小于轴点元素
if (array[begin] < pivot)
{
begin++;
}
//左边元素>轴点元素
else
{
array[end--] = array[begin];
break;
}
}
}
//将备份元素放入原来的位置
array[begin] = pivot;
return begin;
}
void sort(int begin, int end, int* array)
{
//如果元素小于2,将中止快排
if (end - begin < 2)
{
return;
}
//确定轴点的位置
int mid = pivotIndex(begin, end, array);
sort(begin, mid, array);
sort(mid + 1, end, array);
}
int main()
{
int array2[]= { 1,3,2,4,5,2};
int n = sizeof(array2) / sizeof(*array2);
cout << "the length of array2 is " << n << endl;
//快速排序
sort(0, n, array2);
for (int index = 0; index < n; index++)
{
cout << array2[index] << " ";
}
}
结果:
the length of array2 is 6
4
3
2
1
0
3
1 2 2 3 4 5
F:\cppcode\first\Datastruct_and_Algorithm\ds_and_al\Debug\ds_and_al.exe (进程 13776)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...
容器实现
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int pivotIndex(int begin, int end, vector<int> &array)
{
//默认让第一个元素成为节点元素
int pivot = array[begin];
end--;
//快速排序
while (begin < end)
{
//从右向左扫描
while (begin < end)
{
//右边元素大于轴点元素
if (array[end] > pivot)
{
//右边元素索引左移
end--;
cout << end << endl;
}
//右边元素小于轴点元素
else
{
array[begin++] = array[end];
break;
}
}
//从左向右扫描
while (begin < end)
{
//左边元素小于轴点元素
if (array[begin] < pivot)
{
begin++;
}
//左边元素>轴点元素
else
{
array[end--] = array[begin];
break;
}
}
}
//将备份元素放入原来的位置
array[begin] = pivot;
return begin;
}
void sort(int begin, int end, vector<int> &array)
{
//如果元素小于2,将中止快排
if (end - begin < 2)
{
return;
}
//确定轴点的位置
int mid = pivotIndex(begin, end, array);
sort(begin, mid, array);
sort(mid + 1, end, array);
}
int main()
{
vector<int> array2= { 1,3,2,4,5,2 };
int n = array2.size();
cout << "the length of array2 is " << n << endl;
//快速排序
sort(0, n, array2);
for (int index = 0; index < n; index++)
{
cout << array2[index] << " ";
}
}
结果
the length of array2 is 6
4
3
2
1
0
3
1 2 2 3 4 5
F:\cppcode\first\Datastruct_and_Algorithm\ds_and_al\Debug\ds_and_al.exe (进程 12732)已退出,返回代码为: 0。
若要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口...