当前位置: 代码迷 >> 综合 >> 排序(模板)
  详细解决方案

排序(模板)

热度:75   发布时间:2023-10-23 08:39:32.0

快速排序:

#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;int a[100005];void Sort(int left, int right)
{if ( left >= right )return ;int i = left, j = right;int key = a[left];while ( i < j ){while ( i < j&&key <= a[j] )j--;a[i] = a[j];while ( i < j&&key >= a[i] )i++;a[j] = a[i];}a[i] = key;Sort(left, i-1);Sort(i+1, right);
}int main()
{int n, i;while ( ~scanf ( "%d", &n ) ){for ( i = 0;i < n; i++ )scanf ( "%d", &a[i] );Sort(0, n-1);for ( i = 0;i < n; i++ )printf ( i != n-1 ? "%d " : "%d\n", a[i] );}
}

堆排序:

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;void heapAdjust ( int a[], int i, int size )
{int left_size = 2*i;int right_size = 2*i+1;int cnt = i;/*The rules of large Root Sort   大根堆的规则*/if ( i <= size/2 ){if ( left_size <= size && a[left_size] > a[cnt] )cnt = left_size;if ( right_size <= size && a[right_size] > a[cnt] )cnt = right_size;/*Overall adjustment Sort   对序列的整体调整*/if ( cnt != i ){swap( a[i], a[cnt] );heapAdjust ( a, cnt, size );}}
}void buildHeap ( int a[], int size )
{int i;for ( i = size/2;i > 0; i-- ){heapAdjust ( a, i, size );}
}void heapSort( int a[], int size )
{int i;/*To establish a large Root Sort under the initial state建立初始状态下的大根堆*/buildHeap ( a, size );/*Adjust the Sort          调整序列*/for ( i = size;i > 0; i-- ){swap ( a[1], a[i] );heapAdjust ( a, 1, i-1 );}
}int main()
{int size, i;int a[100];/*输入数据     Input data*/scanf ( "%d", &size );for ( i = 1;i <= size; i++ ){scanf ( "%d", &a[i] );}/*堆排序      Heap sort start*/heapSort( a, size );/*输出数据     Output data*/for ( i = 1;i <= size; i++ ){printf ( i == size ? "%d\n" : "%d ", a[i] );}return 0;
}

希尔排序

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;int a[10002], n;void Shell(int p, int r)
{int d = r-p+1;       //将 length(A) 赋给d int i, j, tmp;while ( d >= 1 ){d = d/2;for ( i = p+d;i <= r; i++ ){tmp = a[i];j = i-d;         //从i的前一个步长开始while ( j >= p&&tmp < a[j] ){a[j+d] = a[j];//记录后移 j = j-d;      //向前计数 }a[j+d] = tmp;}}
}int main()
{int i;while ( ~scanf ( "%d", &n ) ){for ( i = 1;i <= n; i++ )scanf ( "%d", &a[i] );Shell(1, n);for ( i = 1;i <= n; i++ )printf ( "%d ", a[i] );}
}


归并排序

#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;int s[100005];void comput( int s[], int top, int mid, int en )
{int left_size = mid - top +1;int right_size = en - mid;int LEFT[left_size+1];int RIGHT[right_size+1];for( int i = 0;i < left_size; i++ ){LEFT[i] = s[top+i];}LEFT[left_size] = ( 1<<30 ); //这里我稍微注释一下,这里主要是为了不用后面的while(),相信在很多的模板中都会出现while(),这是因为可能会在数组里残留这一些                                                      元素,而这种方法完全的避免了while,因为他们数组的最后一个都是很大很大的数当然会排在最后了,之要输出个数保持好就可以避免了,哈哈  for( int i = 0;i < right_size; i++ ){RIGHT[i] = s[mid+i+1];}RIGHT[right_size] = ( 1<<30 );int i = 0;int j = 0;for ( int k = top; k <= en; k++){if( LEFT[i] <= RIGHT[j] ){s[k] = LEFT[i++];}else{s[k] = RIGHT[j++];}}return ;
}void mergesort( int s[], int top, int en )
{if( top != en ){int mid = ( top + en ) / 2;mergesort( s, top, mid );mergesort( s, mid+1, en );comput( s, top, mid, en );}return ;
}int main()
{int n,i;while ( ~scanf ( "%d", &n ) && n != 0 ){for( i = 0;i < n; i++ ){scanf ( "%d", &s[i] );}mergesort( s, 0, n-1 );for( i = 0;i < n; i++ ){printf( "%d ", s[i] );}}
}



  相关解决方案