昨晚睡觉前选了leetcode的一道题去做,结果最后也没通过,今早才调试出来。
以下是题目:
Sort Colors
Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note:
You are not suppose to use the library's sort function for this problem.
Follow up:
A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
下面是我最后AC的代码,基本就是一个计数排序的标准代码。
<span style="font-size:14px;">class Solution {
public:
void sortColors(int A[], int n) {
int *B=new int[3]; //存储,0,1,2
int *C=new int[n]; //存储数据备份
for(int b=0;b<3;b++)
{
B[b]=0; //初始化
}
for(int a=0;a<n;a++)
{
C[a]=A[a]; //初始化,复制
}
for(int i=0;i<n;i++)
{
B[A[i]]++; // 计算每个数据的个数
}
for(int j=1;j<3;j++)
{
B[j]=B[j]+B[j-1]; // 累加
}
for(int k=n;k>0;k--)
{
A[B[C[k-1]]-1]=C[k-1]; //
B[C[k-1]]--;
}
}
};</span>
关于计数排序;
计数排序在对一定范围内的整数排序时,它的时间复杂度为Ο(n+k)(其中k是整数的范围),是线性的,快于任何比较排序算法。
计数排序的过程中没有用到比较,即没有把任何两个数据直接拿来比较大小这是它性能优越的一个很大原因。