您的位置:首页 > 其它

几种排序算法总结:

2016-03-11 18:58 239 查看
几种排序算法总结:

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
>k && n>i)

n--;

if(m<=n)

{

temp = a[m];

a[m] = a
;

a
= 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;

}

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