几种排序算法总结:

来源:互联网 发布:飞利浦x830软件 编辑:程序博客网 时间:2024/06/06 17:53
几种排序算法总结:
 
1)冒泡排序

冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束,在最后的数必是所有数中的最小数。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将大数放前,小数放后,一直比较到最小数前的一对相邻数,将大数放前,小数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。

主要代码:

void MaopaoSort(int *arr,int n)

{

int temp,i=0,j=0,k=0; 

for(i=1;i<n;i++)

{

for(j=0;j<n-i;j++)

{

if(arr[j]>arr[j+1])

{

temp=arr[j+1];

arr[j+1]=arr[j];

arr[j]=temp;

}

}

}

}


2插入排序

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

主要代码:

void insertSort(int *a, int n)

{

    int i,j,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--;

         }

         a[j+1] = temp;

    } 

}

3选择排序

1)在一组元素V[i]~V[n-1]中选择具有最小排序码的元素(2)若它不是这组元素中的第个元素,则将它与这一组元素中的第一个元素对调;(3)在这组元素中剔除这个具有最小排序码的元素,在剩下的元素V[i+1]~V[n-1]中重复执行第(1)(2)步,直到剩余元素只有一个为止。

主要代码:

void selectSort(int *a,int n)

{

    int i,j,k,temp;

     for(i = 0; i<n - 1; i++)

     {

        k = i;

        for(j = i+1; j<n; j++)

        {

           if(a[k]>a[j])

              k = j;

        } 

if(i==k) continue; 

            temp = a[i];

            a[i] = a[k];

            a[k] = temp; 

     }

4)快速排序

首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序;

主要代码:

void quickSort(int *a, int i, int j)

{

     int m,n,temp,k; 

     n = j;m = i;     

     k = a[(i+j)/2];

     do

     {

        while(a[m]<k && m<j)

            m++;

        while(a[n]>k && n>i)

            n--;

        if(m<=n)

        {

            temp = a[m];

            a[m] = a[n];

            a[n] = temp;

            m++;

            n--;

        }

     }while(m<=n); 

     if(m<j)

        quickSort(a,m,j);

     if(n>i)

        quickSort(a,i,n); 

}

5) 希尔排序

先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止;

主要代码:(此例中:d1=3)

void shellSort(int *a, int n)

{

    int i,j,k,x;

    k = n/3;

    while(k>=1)

    {

        for(i = k; i<n; i++)

        {

            x = a[i];

            j = i - k;

            while(j>=0 && x<a[j])

            {

                a[j+k] = a[j];

                j-=k;

            }

            a[j+k] = x;

        }

        k/=2;

    } 

} 
1 0