排序

来源:互联网 发布:怎么去掉windows水印 编辑:程序博客网 时间:2024/06/14 06:30

排序

冒泡排序算法

void maopaosort(int a[],int n){for (int i = 0; i < n; i++)for (int j =1; j < n; j++){if (a[j] < a[j - 1]){int t;t = a[j - 1];a[j - 1] = a[j];a[j] = t;}}}
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

----来自百度百科

假如是从大到小那么

原始排序 5 4 7 2 7 5

第一次排序 5 7 4 7 5 2

第二次排序 7 5 7  5 4 2

第三次排序 7 7 5 5 4 2

排序原理

冒泡排序算法的运作如下:(从后往前)
  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较


#include<iostream>#include<string>#include<ctime>#include<math.h>#include<stdlib.h>#include<algorithm>using namespace std;/*冒泡排序*/void maopaosort(int a[],int n){for (int i = 0; i < n; i++)for (int j =1; j < n; j++){if (a[j] < a[j - 1]){int t;t = a[j - 1];a[j - 1] = a[j];a[j] = t;}}}/*选择排序*/void selectsort(int a[],int n){for (int i = 0; i < n; i++)for (int j = i + 1; j <n; j++)if (a[j]>a[i]){int t;t = a[i];a[i] = a[j];a[j] = t;}}/*鸡尾酒排序*/void jiweijiusort(int a[],int n){int left = 0;int right = n - 1;while (left < right){for (int i = left; i < right; i++)if (a[i+1] > a[i])//从大到小{int t;t = a[i];a[i] = a[i+1];a[i+1] = t;}right--;for (int i = right; i > left; i--)if (a[i]>a[i-1]){int t;t = a[i - 1];a[i - 1] = a[i];a[i] = t;}left++;}}/*插入排序*/void Insertsort(int a[],int n){int i, j,get;for (i = 1; i < n; i++){get = a[i];j = i - 1;while (j >= 0 && get < a[j]){a[j + 1] = a[j];j--;}a[j + 1] = get;}}/*折半插入排序*/void zheban(int a[],int n){    int tmp;    for(int i=1;i<n;i++)    {        tmp=a[i];        int low=0;        int high=i-1;        while(low<=high)        {            int mid=(low+high)/2;            if(tmp<a[mid])                high=mid-1;            else                low=mid+1;        }        for(int j=i-1;j>=high+1;j--)            a[j+1]=a[j];            a[high+1]=tmp;    }}/*快速排序*/void Qsort(int a[], int low, int high){    if(low >= high)    {        return;    }    int first = low;    int last = high;    int key = a[first];    while(first < last)    {        while(first < last && a[last] >= key)        {            --last;        }        a[first] = a[last];        while(first < last && a[first] <= key)        {            ++first;        }        a[last] = a[first];    }    a[first] = key;    Qsort(a, low, first-1);    Qsort(a, first+1, high);}/*希尔排序*/void xier(int a[],int n){    int gap;    for(gap=n/2;gap>0;gap/=2)        for(int i=gap;i<n;i++)            for(int j=i-gap;j>=0&&a[j]>a[j+gap];j=j-gap)                swap(a[j], a[j + gap]);}/*归并排序*/void Merge(int a[],int low,int mid,int high){    int N=high-low+1;    int b[N];    int i=low;    int j=mid+1;    int k=low;    while(i<mid+1&&j<high+1)    {        if(a[i]<a[j])        {           b[k]=a[i];           i++;           k++;        }        else        {            b[k]=a[j];            j++;            k++;        }    }    while(i<mid+1)    {        b[k]=a[i];        i++;        k++;    }    while(j<high+1)    {        b[k]=a[j];        k++;        j++;    }    for(i=low;i<=high;i++)    {        a[i]=b[i];    }}void mergesort(int a[],int L,int R){    if(L<R)    {        int M=(L+R)/2;        mergesort(a,L,M);        mergesort(a,M+1,R);        Merge(a,L,M,R);    }}/*堆排序*/void Heapsift(int a[],int size,int element){    int leftchild=2*element+1;    int rightchild=leftchild+1;    while(rightchild<size)    {        if(a[element]<a[rightchild]&&a[element]<a[leftchild])        {            return ;        }        else        {            if(a[rightchild]>=a[leftchild])            {                swap(a[leftchild],a[element]);                element=leftchild;            }            else            {                swap(a[rightchild],a[element]);                element=rightchild;            }        }            leftchild=2*element+1;            rightchild=leftchild+1;    }        if(leftchild<size&&a[leftchild]<a[element])        {            swap(a[leftchild],a[element]);        }        return ;}void Heapsort(int a[],int size){    int i;    for(i=size-1;i>=0;i--)    {        Heapsift(a,size,i);    }    while(size>0)//拆除树    {        swap(a[size-1],a[0]);        size--;        Heapsift(a,size,0);    }    return ;}int main(){    int a[100000];srand(time(0));for (int i = 0; i < 100000; i++){int x = rand();if (abs(x) < 300000000)a[i] = x;}//zheban(a,100000);//Heapsort(a,100000);//for(int i=0;i<10000;i++)      //  cout<<a[i]<<endl;    return 0;}


0 0