排序 — 最常用的就是冒泡排序。 冒泡排序: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
for(i = 0; i < n; i++)
{
for(int j = i +1; j< n ;j++)
{
if(array[i] > array[j])
{int a = array[i];
array[i] = array[j];
array[j] = a;
}
}
}
理解冒泡算法很简单:第一次以第一个数据为开始比较拿到数据中的最值放到原来的位置,然后往下移动一次,找寻另外的n-1个数据中的最值,放入第二个位置,一次这样运行结束。
冒泡排序的时间复杂度计算:由于在循环的最中心的区域有数据比较和交换的执行,所以这三行代码要计算时间复杂度,因此最短时间为n*(n-1)/2 ;最长时间是 n*3(n-1)/2;平均起来时间复杂度就是 O(n^2)。其实这个计算不合理,以为在循环的核心中有比较计算,比较计算也是需要耗费时间的,那么应该是n*(n-1)/2 和n*4(n-1)/2的均值。
去重算法 — 比较去重
对于一个数据结构判断重复的数组不能直接在原有的数据结构中剔除,这样会导致数据结构索引溢出。
最常用最简单的算法就是一次比较去重:
for(i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++ )
{
if(array[i] == array[j])
{
continue;
}
else
{
if(j == n-1)
{
//都比较完了
list.add(array[i]);
}
}
}
}
时间复杂度平均值:[n*(n-1)/2 + n*2(n-1)/2]/2 ~= O(1.5n^2)
空间复杂度平局值:O(n)