排序算法总结
2009-09-03 22:37
369 查看
1 选择排序
选择排序的思想是依次从待排序数列中选择最大(小)的、第二大(小)的等等,然后依次重新排列为有序数列。
void SelectionSort(int a[], int n)
{
int i,j,min,temp;
for(int i =0; i< n-1; i++){
min = i;
for(j = i+1; j<n;j++){
if(a[i]>a[j]){
min = j;
}
}
if(min != i){
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
}
时间复杂度O(n^2);
2 归并排序
void Merge(int a[], int left, int mid, int right)
{
int begin1,end1,begin2,end2;
begin1 = left;
end1 = mid;
begin2 = mid+1;
end2 = right;
int *temp = new int[right-left+1];
int k=0;
while(begin1<end1 && begin2<end2)
{
if(a[begin1]<a[begin2]{
temp[k] = a[begin1];
begin1++;
}
else{
temp[k] = a[begin2];
begin2++;
}
k++;
}
while(begin1<=end1){
temp[k++] = a[begin1++];
}
while(begin2<=end2){
temp[k++]= a[begin2++];
}
for(int i=0; i< right-left+1; i++){
a[left+i] = temp[i];
}
}
void MergeSort( int a[], const int first, const int last)
{
int min = 0;
if(first<last)
{
mid = (first+last)/2;
MergeSort(a, first, mid);
MergeSort(a, mid+1, last);
Merge(a, first, mid, last);
}
}
3 插入排序
void InsertionSort(int a[], int n)
{
int i,j;
int key;
for(i = 1; i< n; i++){
key = a[i];
j = i-1;
while(j>=0 && a[j]<key){
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
void InsertionSort1(int a[], int n)
{
int i, j;
int key;
for(i=1; i<n; i++){
if(a[i] <a[i-1]){
key= a[i];
for(j=i-1; key<a[j];j--){
a[j+1] = a[j];
}
a[j+1]=key;
}
}
}
void BiInsertSort(int a[], int n)
{
int i,j;
int key;
int low, high;
for(i = 1; i<n; i++){
key = a[i];
low=0; high= i-1;
while(low<=high){
int m = (high-low)/2+1;
if(key<a[m])
high = m;
else
low = m+1;
}
for(j = i-1; j>=high+1 && a[j]>key; j--){
a[j+1]=a[j];
}
a[j+1]=key;
}
}
4 冒泡排序
void BubbleSort(int a[], int n)
{
int i, j;
for(i = n-1; i>=0; i--){
for(j=0; j<i; j++){
if(a[j]>a[j+1])
swap(a[j], a[j+1]);
}
}
}
void BubbleSort1( int a[], int n)
{
int i,j;
bool change;
for(i = 0; i<n; i++){
change =false;
for(j=n-2; j>=i; j--){
if(a[j+1]<a[j]){
swap(a[j], a[j+1]);
change = true;
}
}
if(!change)
return;
}
}
5 快速排序
6 堆排序
7 计数排序
8 基数排序
选择排序的思想是依次从待排序数列中选择最大(小)的、第二大(小)的等等,然后依次重新排列为有序数列。
void SelectionSort(int a[], int n)
{
int i,j,min,temp;
for(int i =0; i< n-1; i++){
min = i;
for(j = i+1; j<n;j++){
if(a[i]>a[j]){
min = j;
}
}
if(min != i){
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
}
时间复杂度O(n^2);
2 归并排序
void Merge(int a[], int left, int mid, int right)
{
int begin1,end1,begin2,end2;
begin1 = left;
end1 = mid;
begin2 = mid+1;
end2 = right;
int *temp = new int[right-left+1];
int k=0;
while(begin1<end1 && begin2<end2)
{
if(a[begin1]<a[begin2]{
temp[k] = a[begin1];
begin1++;
}
else{
temp[k] = a[begin2];
begin2++;
}
k++;
}
while(begin1<=end1){
temp[k++] = a[begin1++];
}
while(begin2<=end2){
temp[k++]= a[begin2++];
}
for(int i=0; i< right-left+1; i++){
a[left+i] = temp[i];
}
}
void MergeSort( int a[], const int first, const int last)
{
int min = 0;
if(first<last)
{
mid = (first+last)/2;
MergeSort(a, first, mid);
MergeSort(a, mid+1, last);
Merge(a, first, mid, last);
}
}
3 插入排序
void InsertionSort(int a[], int n)
{
int i,j;
int key;
for(i = 1; i< n; i++){
key = a[i];
j = i-1;
while(j>=0 && a[j]<key){
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
void InsertionSort1(int a[], int n)
{
int i, j;
int key;
for(i=1; i<n; i++){
if(a[i] <a[i-1]){
key= a[i];
for(j=i-1; key<a[j];j--){
a[j+1] = a[j];
}
a[j+1]=key;
}
}
}
void BiInsertSort(int a[], int n)
{
int i,j;
int key;
int low, high;
for(i = 1; i<n; i++){
key = a[i];
low=0; high= i-1;
while(low<=high){
int m = (high-low)/2+1;
if(key<a[m])
high = m;
else
low = m+1;
}
for(j = i-1; j>=high+1 && a[j]>key; j--){
a[j+1]=a[j];
}
a[j+1]=key;
}
}
4 冒泡排序
void BubbleSort(int a[], int n)
{
int i, j;
for(i = n-1; i>=0; i--){
for(j=0; j<i; j++){
if(a[j]>a[j+1])
swap(a[j], a[j+1]);
}
}
}
void BubbleSort1( int a[], int n)
{
int i,j;
bool change;
for(i = 0; i<n; i++){
change =false;
for(j=n-2; j>=i; j--){
if(a[j+1]<a[j]){
swap(a[j], a[j+1]);
change = true;
}
}
if(!change)
return;
}
}
5 快速排序
6 堆排序
7 计数排序
8 基数排序