- 直接插入排序
目标:不减序列。
A[0:N-1]
设计思想:
从后往前查找,找到第i个元素在前面已经排好的序列中找到他应该在的位置pos,将[pos:i]的元素往后移。
边界条件:
从第二个元素(也就是下标为1的元素)开始挨个插入到前面已排序好的序列。
比较继续的条件:被比较的A[j]元素比A[i]元素大
比较中止执行插入的条件:被比较的A[j]元素不比A[i]元素大
如何插入:将[pos:i]的元素往后移一个位置。
for (int i = 1; i < size; i++)
{
if (A[i] < A[i - 1])
{
int temp = A[i];
int j;
for (j = i - 1; j >= 0 && A[j] > temp; j -= 1)
A[j + 1] = A[j];
A[j + 1] = temp;
}
}
- 折半插入排序
设计思想:直接插入排序的查找插入位置和移动分离开。查找插入位置换为折半查找。 - 希尔排序
for(int dk=int(size/2);dk>=1;dk=int(dk/2))
for (int i = dk; i < size; i++)
{
if (A[i] < A[i - dk])
{
int temp = A[i];
int j;
for (j = i - dk; j >= 0 && A[j] > temp; j -= dk)
A[j + dk] = A[j];
A[j + dk] = temp;
}
}
如果写成下面这样,则会有j<0而没执行A[j+dk]=temp的错误,此时未能将temp赋值给要插入的地方。切记切记!
for(int dk=int(size/2);dk>=1;dk=int(dk/2))
for (int i = dk; i < size; i++)
{
int temp = A[i];
for (int j = i - dk; j>=0; j -= dk)
{
if (A[j + dk] > temp)
A[j + dk] = A[j];
else {
A[j + dk] = temp;
break;
}
}
}
- 冒泡排序
交换排序之一
for(int i=size-1;i>=1;i--)
for(int j=i-1;j>=0;j--)
if (A[j] > A[i])
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
- 快速排序
交换排序之二
int Partition(int *A, int low, int high)
{
int pivot = A[low];
while (low < high)
{
while (low<high&&A[high]>=pivot) --high;
A[low] =A[high];
while (low < high&&A[low] <= pivot) ++low;
A[high] = A[low];
}
A[low] = pivot;
return low;
}
void quicksort(int *A, int low, int high)
{
if (low < high)
{
int pivotpos = Partition(A, low, high);
quicksort(A, low, pivotpos - 1);
quicksort(A, pivotpos + 1, high);
}
}
这里low和high的情况如何需要进一步探索研究。
- 简单选择排序
for (int i = 0; i < size; i++)
{
int min = A[i];
int min_pos=i;
for (int j = i + 1; j < size; j++)
{
if (A[j] < min)
{
min = A[j];
min_pos = j;
}
}
A[min_pos] = A[i];
A[i] = min;
}
- 堆排序
void adjustdown(int A[], int k, int len)
{
for (int i = 2 * k; i < len; i *= 2)
{
int temp = A[k];
if (A[i] < A[i + 1]&&i+1<len) i++;
if (A[i] > temp)
{
A[k] = A[i];
k = i;
A[i] = temp;
}
}
}
void bulidmaxheap(int A[], int len)
{
for (int i = int(len / 2) + 1; i > 0; i--)
adjustdown(A, i, len);
for (int i = 1; i < len; i++)
{
int temp = A[1];
A[1] = A[len - i];
A[len - i] = temp;
adjustdown(A, 1, len-i);
}
}
- 归并排序
在这里插入代码片