版权声明:=================== 转载请注明出处======================= https://blog.csdn.net/weixin_40583722/article/details/88843015
问题:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:不能使用代码库中的排序函数来解决这道题。
思路及代码:(有Bug)
//归并排序
void sortColors(int* nums, int numsSize)
{
int i,j,m,n;
for(i=0;i<numsSize/2-1;i++) //排序前半部分
{
nums[i] < nums[i+1] ? nums[i] : nums[i+1];
}
for(j=numsSize/2;j<numsSize-1;j++) //排序后半部分
{
nums[j] < nums[j+1] ? nums[j] : nums[j+1];
}
}
//快速排序
int Parition(int* nums, int numsSize) //Partition,复杂度theta(n)
{
int i,tmp;
for(i=1;i<numsSize;i++)
{
if(nums[i]<nums[0]) //错误!原因在于:这样交换之后nums[0]发生了变化!
{
tmp=nums[i];
nums[i]=nums[0];
nums[0]=tmp;
}
}
return i;
}
void sortColors(int* nums, int numsSize)
{
int m=0, sortSize=numsSize;
QuickSort(m, sortSize);
system("pause");
}
int Parition(int* nums, int numsSize) //Partition,复杂度theta(n)
{
int i=0,tmp;
int p=0; //选取pivot=nums[0]
for(int j=i+1;j<numsSize;j++)
{
if(nums[j]<nums[p])
{
i++;
tmp=nums[j];
nums[j]=nums[i];
nums[i]=tmp;
}
tmp=nums[p]; //最后一步:交换主元和最后一个小于它的数
nums[p]=nums[i];
nums[i]=nums[p];
}
return i; //返回主元索引
}
void QuickSort(int m, int sortSize)
{
if(m<sortSize)
{
IndexOfPartition=Parition(int* nums, int numsSize);
QuickSort(m, IndexOfPartition-1);
QuickSort(IndexOfPartition+1, numsSize);
}
}
/* 我的思路:快速排序(首先想到的是排序,第一次用了归并排序,注意到题目中的“原地”,就改成了快速排序)
*
* 代码逻辑:1.第一步:划分成两部分
* 2. 对两个部分进行排序(涉及到递归)
*/
void sortColors(int* nums, int numsSize)
{
int m=0, sortSize=numsSize;
QuickSort(nums, numsSize, m, sortSize);
system("pause");
}
int Partition(int* nums, int numsSize) //Partition,复杂度theta(n)
{
int i=0,tmp;
int p=0; //选取pivot=nums[0]
for(int j=i+1;j<numsSize;j++)
{
if(nums[j]<nums[p])
{
i++;
tmp=nums[j];
nums[j]=nums[i];
nums[i]=tmp;
}
tmp=nums[p]; //最后一步:交换主元和最后一个小于它的数
nums[p]=nums[i];
nums[i]=nums[p];
}
return i; //返回主元索引
}
void QuickSort(int* nums, int numsSize, int m, int sortSize) //排序
{
if(m<sortSize)
{
int IndexOfPartition;
IndexOfPartition=Partition(nums, numsSize);
QuickSort(nums, numsSize, m, IndexOfPartition-1);
QuickSort(nums, numsSize, IndexOfPartition+1, numsSize);
}
}
/* 我的思路:计数排序
*
* 代码逻辑:1.第一步:计数
* 2.第二步:排序
*/
void sortColors(int* nums, int numsSize)
{
int NumOfRed=0;
int NumOfWhi=0;
int NumOfBlue=0;
int i;
for(i=0;i<numsSize;i++) //对颜色进行计数
{
if(nums[i]==0)
NumOfRed++;
else if(nums[i]==1)
NumOfWhi++;
else
NumOfBlue++;
}
for(int j=0;j<NumOfRed;j++)
nums[j]=0;
for(int j=NumOfRed;j<NumOfRed+NumOfWhi;j++)
nums[j]=1;
for(int j=NumOfRed+NumOfWhi;j<numsSize;j++)
{
nums[j]=2;
}
}
知识点:
1. 原地排序算法
2. system("pause")要放在return之前!
3. 函数调用之前必须要声明,如果未声明则会报错Undeclared,如下图:
解决办法(两种):
1. 把定义的函数放在main之前;
2. 在main之前声明函数(一般选这种)。