排序算法

来源:互联网 发布:国民经济数据 编辑:程序博客网 时间:2024/06/06 04:56

1 冒泡排序

/* * 冒泡排序 */#include <stdio.h>#define ARRAYLEN 6void 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 5int 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 5void 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-->rvoid 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;}


0 0