筑業(yè)網seo網站有哪些
目錄
一 堆排序
二 直接選擇排序
一 堆排序
堆排序(Heapsort)是指利用堆積樹(堆)這種數(shù)據(jù)結構所設計的一種排序算法,它是選擇排序的一種。它是 通過堆來進行選擇數(shù)據(jù)。
需要注意的是排升序要建大堆,排降序建小堆。
直接選擇排序的特性總結:
1. 堆排序使用堆來選數(shù),效率就高了很多。
2. 時間復雜度:O(N * logN)
3. 空間復雜度:O(1)
4. 穩(wěn)定性:不穩(wěn)定
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapSort(int* a, int n)
{//向下調整建堆//O(N)for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}//堆排序//O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);end--;}
}int main()
{int arr[] = { 2, 3, 5, 7, 4, 6, 8};//InsertSort(arr, sizeof(arr) / sizeof(int));//排升序//InsertSort(arr, sizeof(arr) / sizeof(int));//排升序HeapSort(arr, sizeof(arr) / sizeof(int));//排升序for (int i = 0; i < sizeof(arr) / sizeof(int); i++){printf("%d ", arr[i]);}
}
?
?
我們可以算算向下建堆的時間復雜度
?
?二 直接選擇排序
直接選擇排序的特性總結:
1. 直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用
2. 時間復雜度:O(N^2)
3. 空間復雜度:O(1)
4. 穩(wěn)定性:不穩(wěn)定
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin;int maxi = begin;for (int i = begin + 1; i <= end; i++){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}Swap(&a[mini], &a[begin]);//檢查maxi是否被換走了if (maxi == begin){maxi = mini;}Swap(&a[maxi], &a[end]);begin++;end--;}
}
本節(jié)的重點是堆排序, 對二叉樹的順序結構基礎要求很高, 大家如果基礎不好或者不太理解,可以看看我二叉樹的博客.?
繼續(xù)加油!