冒泡排序
时间复杂度为O(n^2)
1 2 3 4 5 6 7 8 9
| for(int i=0;i<n-1;i++){ for(int j=0;j<n-1-i;j++){ if(a[j]>a[j+1]){ int temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } }
|
插入排序
时间复杂度:O(n^2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void InsertSort(int arr[], int n) { int i, j, temp; for (i = 1; i < n; i++) { if (arr[i] < arr[i-1]) { temp = arr[i]; for (j = i-1; j >= 0 && temp < arr[j]; j--) { arr[j+1] = arr[j]; } arr[j+1] = temp; } } }
|
堆排序
特点
- 完全二叉树
- 任意节点大于/小于等于其左右孩子称为大根堆/小根堆
- 根节点最大/最小
- 建堆需要从最后一个非叶子节点开始调整
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| void BuildMaxHeap(ElemType A[], int len){ for(int i=len/2; i>0; i--){ HeadAdjust(A, i, len); } }
void HeadAdjust(ElemType A[], int k, int len){ A[0] = A[k]; for(i=2*k; i<=len; i*=2){ if(i<len && A[i]<A[i+1]){ i++; } if(A[0] >= A[i]){ break; }else{ A[k] = A[i]; k = i; } } A[k] = A[0]; } void HeapSort(ElemType A[], int len){ BuildMaxHeap(A, len); for(i = len; i>1; i--){ Swap(A, i, 1); HeapAdjust(A, 1, i-1); } }
|
归并排序
基本原理
将初始序列看成单个的子序列,然后相邻的两个子序列按照由小到大归并排序,然后重复,直到所有的子序列都归并完成
性质
时间复杂度:O(nlog2n)
稳定性:稳定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| ElemType *B = (ElemType *)malloc((n+1)*sizeof(ElemType)); void Merge(ElemType A[], int low, int mid, int high){ for(int 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++]; } } viod MergeSort(ElemType 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); } }
|