秋招手撕代码,最常见的就是排序算法。总结一下
一、冒泡排序
思路:假设数组长度为n,遍历数组n-1次,每次 遍历都能找出最大值,放于 末尾。
void Solution(vector<int> data)
{
int i_length = data.size();
for(int i = i_length - 1;i > 0;--i)
{
for(int j = 0;j<i;++j)
{
if(data[j] > data[j+1])
{
int temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
}
}
}
}
冒泡排序优化:
void Solution(vector<int> data)
{
int i_length = data.size();
bool flag = true;
for(int i = i_length - 1;i > 0 && flag;--i)
{
flag = false;
for(int j = 0;j<i;++j)
{
if(data[j] > data[j+1])
{
int temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
flag = true;
}
}
}
}
时间复杂度分析:
二、简单选择排序
思路:假设数组长度为n,遍历数组n-1次,每遍一次,找出一个最小值。
void Solution(vector<int> data)
{
int i_length = data.size();
for(int i = 0;i< i_length -1;++i)
{
int i_min = i;
for(int j = i+1;j<i_length -1;++j)//先找到最小值位置,再进行交换,可提高性能。
{
if(data[j] < data[i_min])
i_min = j;
}
if(i_min != i)
{
int temp = data[i];
data[i] = data[i_min];
data[i_min] = temp;
}
}
}
时间复杂度分析:
三、直接插入排序
思路:
void Solution(vector<int> data)
{
int i_length = data.size();
for(int i = 1;i< i_length -1;++i)
{
if(data[i] < data[i-1])
{
int temp = data[i];
for(int j = i-1;data[j] > temp;--j)
{
data[j +1] = data[j];
}
data[j +1] = temp;
}
}
}
时间复杂度分析:
四、希尔排序
思路:
//该代码有问题!!!
void Solution(vector<int> data)
{
int i_length = data.size();
int i_enhance = i_length;
do
{
i_enhance = i_enhance/3 +1;
for(int i = i_enhance;i< i_length -1;i++)
{
if(data[i] < data[i-i_enhance])
{
int temp = data[i];
for(int j = i-i_enhance;data[j] > temp;j-= i_enhance)
{
data[j +i_enhance] = data[j];
}
data[j + i_enhance] = temp;
}
}
}
while(i_enhance > 1);
}
五、快速排序