您的位置:首页 > 其它

排序算法

2015-09-12 14:53 239 查看
1 冒泡排序

/*
 * 冒泡排序
 */

#include <stdio.h>

#define ARRAYLEN 6
void BubbleSort(int a[],int n)
{
    int i,j,t;
    for(i=0;i<n-1;i++)
    {
        for(j=n-1;j>i;j--)
        {
            if(a[j-1]>a[j])
            {
                t=a[j-1];
                a[j-1]=a[j];
                a[j]=t;
            }
        }
        printf("第%2d遍:",i+1);
        for(j=0;j<n;j++)
            printf("%d ",a[j]);
        printf("\n");
    }
}
void BubbleSort1(int a[],int n)
{
    int i,j,t,flag=0;        //flag用来标记是否发生交换
    for(i=0;i<n-1;i++)
    {
        for(j=n-1;j>i;j--)
        {
            if(a[j-1]>a[j])//交换数据
            {
                t=a[j-1];
                a[j-1]=a[j];
                a[j]=t;
                flag=1;
            }
        }
        printf("第%2d遍:",i+1);
        for(j=0;j<n;j++)
            printf("%d ",a[j]);
        printf("\n");
        if(flag==0)    //没发生交换,直接跳出循环
            break;
        else
            flag=0;
    }
}
int main()
{
    int i;
    int a[6] = {5,6,7,15,43,62};

    printf("原数据:");
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    BubbleSort(a,ARRAYLEN);
    printf("排序后:");
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}


2. 快速排序

/**
  快速排序
  **/
#include <stdio.h>
#include <iostream>
#define ARRAYLEN 5

int Division(int a[], int left, int right)
{
    int base = a[left];
    while (left<right)
    {
        while(left < right && a[right] > base )
            --right;
        a[left] = a[right];
        while(left < right && a[left]< base)
            ++left;
        a[right] =  a[left];
    }
    a[left] = base;
   return left;

}

void QuickSort(int a[], int left, int right)
{
    int i;
    if(left < right)
    {
        i = Division(a,left,right);
        QuickSort(a,left,i-1);
        QuickSort(a,i+1,right);
    }
}

int main()
{
    int i;
    int a[5] = {20,40,50,10,60};
    printf("原数据:");
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    QuickSort(a,0,ARRAYLEN-1);
    printf("排序后:");
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");

    return 0;
}


3. 堆排序

/*
 *
 * 堆排序
 */
#include <stdio.h>
#include <iostream>
#define ARRAYLEN 5

void HeapAdjust(int a[],int s, int n);
void HeapSort(int a[], int n);

using namespace std;
int main()
{
    int i;
    int a[5] = {20,40,50,10,60};
    printf("原数据:");
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    HeapSort(a,ARRAYLEN);
    printf("排序后:");
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}

// 注意数组长度 n 与 a[i] 序号的关系
void HeapAdjust(int a[], int s, int n)
{
    int child,temp;
    while( 2*s+1 < n) //存在左孩子    2*s+1 表示左子节点的序号  节点s有右子树
    {
       child = 2*s+1;  //左子树
       if( (child+1) <n ) //存在右孩子  2*s+2 表示右子节点的序号  < n   存在
       {
           if(a[child] < a[child+1]) //找s的孩子中最大的。
             child = child + 1;
       }
       if(a[s]<a[child])  //调整s与孩子的关系,使符合堆  需要调整
       {
           temp = a[s];
           a[s] = a[child];
           a[child] =temp;
           s = child;        //调整往下进行
       }
       else
           break;

    }
}

void HeapSort(int a[], int n)
{
    int i,temp;
    for(i=n/2-1; i>=0;i--)
    {
        HeapAdjust(a,i,n);
    }

    for(i= n-1; i>0; i--)
    {
       cout<<a[0]<<endl;
       temp = a[0];
       a[0] = a[i];
       a[i] = temp;
       HeapAdjust(a,0,i);
    }
}
4. 直接插入排序

/* 直接插入排序
 * */

#include<stdio.h>
#include<iostream>

using namespace std;

#define ARRAYLEN 5	//需要排序的数据元素数量
void InserSort(int a[], int n)
{
  int i,j;
  int temp;

  for(i=1; i<n; i++)
  {
      temp = a[i];
      j = i-1;
      while((j>=0) && temp < a[j] )
      {
          a[j+1] = a[j];
          j = j-1;
      }
      a[j+1] = temp;
  }

}

int main()
{
    int i;
    int a[5] = {20,40,50,10,60};

    printf("原数据:"); 	//输出生成的随机数
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    InserSort(a,ARRAYLEN);	//调用插入排序函数
    printf("排序后:");
    for(i=0;i<ARRAYLEN;i++)	//输出排序后的结果
        printf("%d ",a[i]);
    printf("\n");
    return 0;
}


5. 希尔排序

/*
希尔排序
*/
#include<stdio.h>
#include<string.h>
#include<iostream>

#define ARRAYLEN 5	//需要排序的数据元素数量

using namespace std;
void ShellSort(int a[], int n)
{
   int i,j,gap;
   for(gap=n/2; gap>0; gap/=2)  //
   {
       for(i=1; i<n; i++)
       {
           int temp = a[i];
           j = i-gap;
           while((j>=0) && (a[j] > a[i] ))
           {
               a[j+gap] = a[j];
               j = j-gap;
           }
           a[j+gap] = temp;
       }
  }
}

int main()
{
    int i;
    int a[5] = {20,40,50,10,60};

    printf("原数据:"); 	//输出生成的随机数
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    ShellSort(a,ARRAYLEN);	//调用希尔排序函数
    printf("排序后:");
    for(i=0;i<ARRAYLEN;i++)	//输出排序后的结果
        printf("%d ",a[i]);
    printf("\n");

    return 0;
}


6. 归并排序

/*

归并排序

*/
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
#define ARRAYLEN 5    //需要排序的数据元素数量
void MergeSort(int a[], int n);
void  MergePass(int a[], int r[], int n, int len);  //  a-->r
void MergeStep(int a[], int r[], int start_i, int end_1, int end_2);

void MergeSort(int a[], int n)
{
    int *p;
    int gap = 1;
    int flag = 1;
    if(!(p = (int*)malloc(sizeof(int)*n)))
    {
        exit(0);
    }
    while(gap<n)
    {
        if(flag)
        {
          MergePass(a,p,n,gap);    //flag =1 时, a-->p
        }
        else
        {
          MergePass(p,a,n,gap);     //flag =0 时, p-->a
        }
       flag = 1-flag;               //flag  互换
       gap = gap*2;
    }
    if(!flag)
    {
        for(int i=0; i<n; i++)
        {
            a[i] = p[i];
        }
    }
}

/*
 * a[]
 * r[]      存放位置
 * n        a的长度
 * len      a里面已排序块大小
 */
void  MergePass(int a[], int r[], int n, int len)  //  a-->r
{
    int start = 0 ;
    while(start + len < n) //至少有两个有序段  可以合并
    {
      int end = start + 2*len -1;  //对块的后一块的位置
       if(end >=n)     //对块的后一块不足len
           end = n-1;
       MergeStep(a, r, start, start+len-1, end);      //  a-->r
       start =  end + 1; // start = start + len
    }
    if(start < n) //还剩一个有序段,将其从A中复制到R中
        for(; start<n; start++)
            r[start]=a[start];
}

/**
 * @brief MergeStep   将a[start_i,end_i] 合并到r
 * @param a
 * @param r
 * @param start_i    a的对块的第一块起点    a存在对块,则必定第一块最长
 * @param end_i      a的对块的第一块终点
 * @param end        a的对块的第二块结束点
 */
void MergeStep(int a[], int r[], int start_i, int end_1, int end_2)
{
    int start_a = start_i;    // a的对块的第一块起点
    int start_r = start_i;    // r的对块的第一块起点

    int start_a_2 = end_1 + 1; // 第一对块的第二块的起始位置

    while(start_a <= end_1 && start_a_2 <= end_2)  //对块有一个分块合并完就可以结束
    {
        if(a[start_a] <= a[start_a_2])
        {
            r[start_r++] = a[start_a++];
        }
        else
           r[start_r++] = a[start_a_2++];
    }
    while(start_a <= end_1)                   //左分块剩余
    {
       r[start_r++] = a[start_a++];
    }
    while(start_a_2 <= end_2 )                 //右分块剩余
    {
      r[start_r++] = a[start_a_2++];
    }
}

int main()
{
    int i;
    int a[5] = {20,40,50,10,60};

    printf("原数据:");     //输出生成的随机数
    for(i=0;i<ARRAYLEN;i++)
        printf("%d ",a[i]);
    printf("\n");
    MergeSort(a,ARRAYLEN);    //调用合并排序函数
    printf("排序后:");
    for(i=0;i<ARRAYLEN;i++)    //输出排序后的结果
        printf("%d ",a[i]);
    printf("\n");

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: