小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
6、快速排序
void quicksort(vector<int> &q, int l, int r) {
if (l >= r)
return;
int i = l - 1, j = r + 1, x = q[l + rand() % (r - l + 1)];
while (i < j) {
do j--; while (q[j] > x);
do i++; while (q[i] < x);
if (i < j)
swap(q[i], q[j]);
else {
quicksort(q, l, j);
quicksort(q, j + 1, r);
}
}
}
7、堆排序
void initialHeap(vector<int> &nums)
{
int parent = nums.size() / 2;
for (int i = parent - 1; i >= 0; i--)
{
int aparent = i + 1;
int maxchild = i + 1;
while (aparent <= nums.size() / 2)
{
if (nums[aparent * 2 - 1] > nums[aparent - 1])
{
maxchild = aparent * 2 ;
}
if (aparent * 2 + 1 <= nums.size() && nums[aparent * 2 + 1 - 1] > nums[aparent * 2 - 1] && nums[aparent * 2] > nums[aparent - 1])
{
maxchild = aparent * 2 + 1 ;
}
if (maxchild != aparent)
{
swap(nums[aparent - 1], nums[maxchild - 1]);
aparent = maxchild;
maxchild = aparent;
}
else
{
break;
}
}
}
}
void recover(vector<int> &nums, int length)
{
int parent = 1;
int maxchild = parent;
while (parent <= length / 2)
{
if (nums[parent * 2 - 1] > nums[parent - 1])
{
maxchild = parent * 2;
}
if (parent * 2 + 1 <= length && nums[parent * 2] > nums[parent * 2 - 1] && nums[parent * 2] > nums[parent - 1])
{
maxchild = parent * 2 + 1;
}
if (maxchild != parent)
{
swap(nums[parent - 1], nums[maxchild - 1]);
parent = maxchild;
maxchild = parent;
}
else
{
break;
}
}
}
void heapSort(vector<int> &nums)//堆排序进入的函数
{
initialHeap(nums);//首先构造一个堆
for (int i = nums.size() - 1; i >= 0; i--)
{
swap(nums[0], nums[i]);//不断将当前最大值放到对应的位置
recover(nums, i);//调整数组使其继续成为堆
}
}
int main()
{
vector<int> nums = {21,43,11,3,54,12,87,55,23,5};
heapSort(nums);
for (int i = 0; i < nums.size(); i++)
{
cout << nums[i]<<" ";
}
}
8、基数排序
int get(int x, int i){
while(i--)
x /= 10;
return x % 10;
}
void radixSort(vector<int> &q, int n){
vector<vector<int>> cnt(10);
for(int i = 0; i < 3; i++){
for(int j = 0; j < 10; j++)
cnt[j].clear();
for(int j = 0; j < n; j++)
cnt[get(q[j], i)].push_back(q[j]);
for(int j = 0, k = 0; j < 10; j++){
for(int x : cnt[j])
q[k++] = x;
}
}
}