排序(堆排序,快排,归并,希尔)

秒速五厘米 2022-12-29 06:37 316阅读 0赞

1.堆排序

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. void Adjust_Heap( int A[], int k , int n ) { //调整大顶堆
  4. for ( ; k*2 <= n ; k *= 2 ) {
  5. int t = 2*k;
  6. if( t < n && A[t] < A[t+1] ) t ++; // t<n确保有右孩子
  7. if( A[t] > A[k] ) swap( A[t], A[k] );
  8. else break;
  9. }
  10. }
  11. void Create( int A[], int n ) {
  12. for ( int i = n/2; i > 0 ; i --) {
  13. Adjust_Heap( A, i, n );
  14. }
  15. }
  16. void Heap_Sort( int A[], int n ) {
  17. Create( A, n );
  18. while( n > 1) {
  19. swap( A[1], A[n] );
  20. Adjust_Heap( A, 1 , --n );
  21. }
  22. }
  23. int main() {
  24. int n;
  25. scanf("%d", &n);
  26. int A[n+1];
  27. for ( int i = 1; i <= n; i ++ )
  28. scanf("%d", &A[i]);
  29. int num = n;
  30. Heap_Sort( A, n );
  31. for ( int i = 1; i <= num; i ++ )
  32. printf("%d ", A[i]);
  33. return 0;
  34. }
  35. /* 10 23 12 13 44 55 21 89 76 67 9 */

2.快速排序

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int Partition( int A[], int left, int right) {
  4. int init = left;
  5. int pivot = A[left];
  6. while ( left < right ) {
  7. while ( left < right && A[right] >= pivot ) --right;
  8. while ( left < right && A[left] <= pivot ) ++left;
  9. if( left < right)
  10. swap(A[left],A[right]);
  11. }
  12. swap(A[init], A[left]); // 由于先做的是从右往左的查找,所以最后出来的位置,值是小于pivot,就可以交换pivot与A[left]
  13. return left;
  14. }
  15. void Quick_Sort( int A[], int left, int right ) {
  16. if ( left < right) {
  17. int pivot_pos = Partition(A, left, right);
  18. Quick_Sort( A,left, pivot_pos-1 );
  19. Quick_Sort( A, pivot_pos+1, right );
  20. }
  21. }
  22. int main() {
  23. int n;
  24. scanf("%d", &n);
  25. int A[n+1];
  26. for ( int i = 1; i <= n; i ++ )
  27. scanf("%d", &A[i]);
  28. Quick_Sort(A, 1, n );
  29. for ( int i = 1; i <=n; i ++ )
  30. printf("%d ", A[i]);
  31. return 0;
  32. }
  33. /* 10 23 12 13 44 55 21 89 76 67 9 */

3.归并排序

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. void Merge( int A[], int B[], int left, int mid, int right ) {
  4. for ( int i = left ; i <= right; i ++ )
  5. B[i] = A[i];
  6. int i = left, j = mid+1, k = left;
  7. while ( i<=mid && j<=right ) {
  8. if( B[i] <= B[j] )
  9. A[k++] = B[i++];
  10. else
  11. A[k++] = B[j++];
  12. }
  13. while ( i <= mid ) A[k++] = B[i++];
  14. while ( j<= right ) A[k++] = B[j++];
  15. }
  16. void Merge_Sort( int A[], int B[], int left, int right ) {
  17. if ( left < right ) {
  18. int mid = (left + right ) /2;
  19. Merge_Sort( A, B, left, mid );
  20. Merge_Sort( A, B, mid+1, right );
  21. Merge( A, B, left, mid, right );
  22. }
  23. }
  24. int main() {
  25. int n;
  26. scanf("%d", &n);
  27. int A[n+1], B[n+1];
  28. for ( int i = 1; i <= n; i ++ )
  29. scanf("%d", &A[i]);
  30. Merge_Sort(A, B, 1, n );
  31. for ( int i = 1; i <=n; i ++ )
  32. printf("%d ", A[i]);
  33. return 0;
  34. }
  35. /* 10 23 12 13 44 55 21 89 76 67 9 */

4.希尔排序

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. void Shell_Sort( int A[], int n ) {
  4. for ( int dk = n/2; dk >= 1; dk /= 2 ) { //模拟步长变化
  5. for ( int i = dk+1; i <= n; i ++ ) {
  6. if( A[i] < A[i-dk] ) {
  7. A[0] = A[i];
  8. int j = i-dk;
  9. for ( ;j>0 && A[0]<A[j]; j -= dk )
  10. A[j+dk] = A[j];
  11. A[j+dk] = A[0];
  12. }
  13. }
  14. }
  15. }
  16. int main() {
  17. int n;
  18. scanf("%d", &n);
  19. int A[n+1], B[n+1];
  20. for ( int i = 1; i <= n; i ++ )
  21. scanf("%d", &A[i]);
  22. Shell_Sort( A, n );
  23. for ( int i = 1; i <=n; i ++ )
  24. printf("%d ", A[i]);
  25. return 0;
  26. }
  27. /* 10 23 12 13 44 55 21 89 76 67 9 */

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读