(1)思想

void InsertSort(int A[], int n) {
int i, j, temp;
for(int i=1; i<n; i++) {
temp = A[i];
for(int j=i-1;j>=0 && A[j] >temp; j--) {
A[j+1] = A[j]; // 元素后移
}
A[j+1] = temp;
}
}
(2)效率
(1)思想



void ShellSort(int A[], int n) {
int d, i, j;
for(d =n/2;d >=1; d=d/2) {
for(int i=d+1; i<=n; i++) { // i =d+1保证了前d个元素可被查找
// 开始插入排序
if(A[i] <A[i-d]) {
A[0] = A[i];
for(int j=i-d;j >0 && A[0] <A[j]; j=j-d) {
A[j+d] = A[j];
}
A[j+d] = A[0];
}
}
}
}
(2)算法性能

希尔排序是对插入排序的优化。插入排序是对整个待排序数组,从头到尾将每个元素插入到前面有序的子数组中。希尔排序相对于插入排序而言,会先对步长为d的子数组进行排序。通过逐渐减小d值,最终实现对整个数组的插入排序。采用这样的方法,是为了避免插入排序最坏的情况,即原数组是按照降序排列的,对于每个元素都需要与已排序序列中所有元素比较。
(1)思想
void BubbleSort(int A[], int n) {
for(int i=0; i <n-1; i++) {
bool flag = false;
for(int j=n-1; j>i; j--) {
if(A[j-1] >A[j]) {
swap(A[j], A[j-1]);
flag = true;
}
}
if(flag == true)
return;
}
}
(2)算法性能
(1)思想
快速排序算法主要分为两个步骤:①获取基准值并使左边小于基准,右边大于基准。②递归
int Partition(int A[], int low, int high) {
int pivot = A[low]; // 选择最左作为基准值
while(low <high) {
//1. 找到第一个右侧大于和左侧小于pivot的元素,并交换两个元素。
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);
}
}
(2)算法效率
时间复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)
①最好情况下:
O
(
n
log
n
)
O(n\log n)
O(nlogn)
②最坏情况下:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
①最好情况下:
O
(
log
n
)
O(\log n)
O(logn)
②最坏情况下:
O
(
n
)
O(n)
O(n)

稳定性:不稳定。
当选择的基准元素将待排序序列划分为均匀的两个部分时,算法的运行效率更高。如果序列被划分为不均匀的两部分,则会导致递归深度增加,算法效率变低。
在实际运用中,快速排序更倾向于最好情况。因此这也是快排在众多排序算法中被运用最广泛的原因之一。
(3)优化
(1)思想

void SelectSort(int A[], int n) {
for(int i=0; i<n-1; i++) {
int min = i; // 最小位置
// 1.寻找待排序序列中最小元素
for(int j=i+1; j<n; j++) {
if(A[j] <A[min])
min = j;
}
// 2. 将元素插入队尾
if(min !=i)
swap(A[min], A[i]);
}
}
(2)算法性能
(1)堆


(2)思想
void HeapSort(int A[], int len) {
BuildMaxHeap(A, len); // 建立最大堆
// 交换堆顶元素和最后一个元素,再对待排序序列调整为大根堆。
for(int i=len; i>1; i++) {
swap(A[i], A[1]);
HeadAdjust(A, 1, i-1); // "下坠"
}
}

(3)算法性能



(1)思路

void Merge(int A[], int low, int mid, int high) {
int i, j, k;
// 复制
for(k =low; k<=high; k++)
B[k] = A[k];
// 范围内比较
for(i =low, j=mid+1, k =i;i <=mid&&j <=high;k++) {
if(B[i] <=B[j])
A[k] = B[i++];
else
A[k] = B[j++];
}
// 多余部分
while(i <=mid)
A[k++] = B[i++];
while(j <=high)
A[k++] = B[j++];
}
void MergeSort(int A[], int low, int high) {
if(low <high) {
int mid = (low + high) / 2;
// 分别排序
MergeSort(A, low, mid);
MergeSort(A, mid+1, high);
// 合并
Merge(A, low, mid, high);
}
}
(3)算法性能
(1)思想
基数排序不是基于比较的排序算法。


(2)算法性能
