排序算法总结

来源:互联网 发布:java 代码生成框架 编辑:程序博客网 时间:2024/04/29 18:33

最近马上就要校招了,开始进入刷题模式,做了一些题后发现,排序算法实际上是好多题目的基础,掌握好各种排序算法对处理各种复杂题目是十分有帮助的。

好了,话不多说,概念大家都懂,我直接上代码,以下代码我全部手敲了一遍,建议大家也自己敲一遍,再比较一下各种算法的异同。

先列个表总结一下:


冒泡排序:

#include <iostream>using namespace std;void swap(int *a, int *b){    int c;    c = *a;    *a = *b;    *b =  c;}int main(){    int num[10];    int i,j;    //初始化数组为10 9 8 7 6 5 4 3 2 1    for (i = 0; i < 10; i++){        num[i] = 10 - i;    }    //排序,从a[0]开始排,从小到大    for (i = 0; i < 10; i++){        for (j = i + 1; j < 10; j++){            if (num[i] > num[j]){                swap(&num[i], &num[j]);            }        }    }    for (i = 0; i < 10; i++)       cout<<num[i]<<endl;    return 0;}

堆排序:

#include <iostream>#include <algorithm>using namespace std;void HeapAdjust(int *a,int i,int size)  //调整堆{    int lchild=2*i;       //i的左孩子节点序号    int rchild=2*i+1;     //i的右孩子节点序号    int max=i;            //临时变量    if(i<=size/2)          //如果i是叶节点就不用进行调整    {        if(lchild<=size&&a[lchild]>a[max])        {            max=lchild;        }        if(rchild<=size&&a[rchild]>a[max])        {            max=rchild;        }        if(max!=i)        {            swap(a[i],a[max]);            HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆        }    }}void swap(int* a,int* b){    int* temp;    temp=a;    a=b;    b=temp;}void BuildHeap(int *a,int size)    //建立堆{    int i;    for(i=size/2;i>=1;i--)    //非叶节点最大序号值为size/2    {        HeapAdjust(a,i,size);    }}void HeapSort(int *a,int size)    //堆排序{    int i;    BuildHeap(a,size);    for(i=size;i>=1;i--)    {        //cout<<a[1]<<" ";        swap(a[1],a[i]);           //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面          //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆        HeapAdjust(a,1,i-1);      //重新调整堆顶节点成为大顶堆    }}int main(int argc, char *argv[]){     //int a[]={0,16,20,3,11,17,8};    int a[100];    int size;    cin>>size;    if(size>0)    {        int i;        for(i=1;i<=size;i++)            cin>>a[i];        HeapSort(a,size);        for(i=1;i<=size;i++)            cout<<a[i]<<" ";        cout<<endl;    }    return 0;}
插入排序:

#include<iostream>#include<algorithm>using namespace std;void insertsort(int* a,int size){   int key;   int i,j;   for(j=2;j<=size;j++){      i=j-1;      key=a[j];      while(i>0&&a[i]>key){         a[j]=a[i];         i=i-1;     }     a[i+1]=key;   }}int main(int argc,char* argv[]){    int a[100];    int size;    cin>>size;    if(size>0)    {        int i;        for(i=1;i<=size;i++)            cin>>a[i];        insertsort(a,size);        for(i=1;i<=size;i++)            cout<<a[i]<<" ";        cout<<endl;    }    return 0;}
快速排序:

#include<iostream>using namespace std;/*  Quick Sort  */void swap(int& a,int& b){   int temp;   temp = a;   a = b;   b = temp;}int partition(int* a,int p,int q){     int i = p-1;     int j;     for(j=p;j<q;j++){         if(a[j]<=a[q]){            i++;            swap(a[i],a[j]);         }     }     swap(a[i+1],a[q]);     return i+1;}void quicksort(int* a,int p,int q){     int r;     if(p<q){        r = partition(a,p,q);        quicksort(a,p,r-1);        quicksort(a,r+1,q);     }}int main(){    int array[100];    int size;    int i;    cout<<"please input the size:"<<endl;    cin>>size;    cout<<"please input the array:"<<endl;    for(i=0;i<size;i++)       cin>>array[i];    quicksort(array,0,size-1);    cout<<"sorted array:"<<endl;    for(i=0;i<size;i++)       cout<<array[i]<<" ";    return 0;}
归并排序:

#include<iostream>using namespace std;#define MAX_NUM 99999#define Length 10void Merge(int* arr,int p,int q,int r){    int n1 = q - p + 1;    int n2 = r - q;    int i,j,k;    int* tmp1 = new int[n1+1];    int* tmp2 = new int[n2+1];    for(i=0;i<n1;i++)      tmp1[i] = arr[p+i];    for(j=0;j<n2;j++)      tmp2[j] = arr[q+j+1];    tmp1[n1] = tmp2[n2] = MAX_NUM;    i = j = 0;    for(k=p;k<=r;k++)    {        if(tmp1[i]<=tmp2[j])        {            arr[k] = tmp1[i];            i++;        }        else        {            arr[k] = tmp2[j];            j++;        }    }    delete tmp1;    delete tmp2;}void Merge_Sort(int* arr,int p,int r){    if(p < r)    {        int q = (p+r)/2;        Merge_Sort(arr,p,q);          Merge_Sort(arr,q+1,r);         Merge(arr,p,q,r);    }}int main(){   int* arr = new int[Length];   cout<< "input 10 data of arr"<<endl;   for(int i=0;i<Length;i++)       cin>>arr[i];   Merge_Sort(arr,0,Length-1);   for(int i=0;i<Length;i++)       cout<<i<<": "<<arr[i]<<endl;   return 0;}





1 0
原创粉丝点击