我所理解的快速排序算法(加上黄金分割就完美啦~)
快速排序是在实践中最快的已知排序算法,它的平均运行时间是O(NlogN)。该算法之所以特别快,主要是由于非常精练和高度优化的内部循环。在队列中寻找合适的枢点元素,并按枢点元素划分序列,是快速排序算法的关键。
为简单起见,我这里数组的第一个元素作为枢点元素,重新排列数组,使得枢点元素之前的元素都小于枢点元素,而枢点元素之后的元素都大于或等于枢点元素。
在这里我提供算法的两种实现:
第一种:
template <class T>
int Parttion(T a[], int low, int high)
{
T x = a[low];
while (low < high)
{
while (low < high && a[high] >= x)
high–;
a[low] = a[high];
while (low < high && a[low] < x)
low++;
a[high] = a[low];
}
a[low] = x;
return low;
}
第二种:
template <class T>
int Parttion(T a[], int low, int high)
{
T x = a[low];
int i = low;
for (int j=low+1; j<=high; j++)
{
if (a[j] <= x)
{
i++;
if (i != j)
Swap(a[i], a[j]);
}
}
Swap(a[low], a[i]);
return i;
}
template <class T>
void Swap(T & a, T & b)
{
T t = a;
a = b;
b = t;
}
快速排序的驱动程序:
template <class T>
void QuickSort(T a[], int len)
{
Qsort(a, 0, len-1);
}
template <class T>
void Qsort(T a[], int low, int high)
{
if (low < high)
{
int k = Parttion(a, low, high);
Qsort(a, low, k-1);
Qsort(a, k+1, high);
}
}
Jun 22 2006
快速排序
Jun 22 2006
把一些琐碎的东西记录起来
cpp已经忘记得7788了。。。突然被人问起,数组大小能不能动态指定。。。java是可以的。。。然后:
C99 之前,声明数组时,[] 中的值必须是大于零的整数常量。C99 中,声明数组时,[] 中可以是变量。这就是所谓的变长数组(variable-length array,简称 VLA)。声明 VLA 时,不能对其进行初始化。
Jun 22 2006
6月22日,上班上得无聊
昨天是夏至,但今天才是最热的。。。。35度+。。。
65年前的6.22,4千多萬配備精良裝甲武器被瘋狂信念支配的戰士沿著綿延數千公里的戰綫廝殺了1417天。
某个猪头的签名,随便查了一下
战役 兵力(万人) 纯减员 伤病 合计 作战日期
波罗的海沿岸防御战役 49.80 75202 13284 88486 6.22-7.9
白俄罗斯防御战役 62.73 341073 76717 417790 6.22-7.9
乌克兰防御战役 86.46 172323 69271 241594 6.22-7.6