您的位置:首页 > 其它

交换排序(冒泡排序、快速排序)

2012-10-07 20:36 239 查看
[align=justify]冒泡排序 [/align]

[align=justify]排序过程:[/align]

[align=justify]设数组长度为n,按从小到大排序[/align]
[align=justify] 1 .比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。这样对数组的第 0个数据到 n-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第 n-1个位置。排序共进行 n-1次比较;[/align]
[align=justify] 2 .n=n-1 ,如果n不为 0就重复第一步,比较前 n-1个数。排序共进行 n-2次;[/align]
[align=justify] 3.以此类推,共做n-1次排序,完成排序过程[/align]

[align=justify]复杂度[/align]

[align=justify]若文件的初始状态是正序的,一次排序即可完成。所需比较次数为 n-1次,记录移动次数为 0。因此,冒泡排序最好的时间复杂度为O(n)。[/align]
[align=justify] 若初始文件是反序的,需要进行 n-1次排序。每次排序要进行 n-i次比较 (1<=i<=n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较次数达到最大值 n(n-1)/2=O(n^2),移动次数也达到最大值3n(n-1)/2=O(n^2)。因此,冒泡排序的最坏时间复杂度为O(n^2)。[/align]

[align=justify] 代码:[/align]

void BubbleSortt(int *arr,int n)
{
if(NULL == arr)
return;
int i,j,flag,temp;
for( i = 0; i < n-1; i++)   // 进行n-1次排序
{
flag = 1;
for( j = 0; j < n-i-1; j++){   // 每次排序进行n-1-i次比较
if(arr[j] > arr[j+1]){
temp= arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 0;
}
}
if(1 == flag){
printf( "%d",i); // 首先打印出,在第几层循环时顺序已排好
break; // 跳出循环
}
}
}


快速排序

快速排序是对冒泡排序的一种改进。

它的基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

排序过程

[align=justify] 第一步,在待排序的 n个数中任取一个数,以该数作为标准,将所有数分成两组,第 1组各数都小于等于标准,第 2组各数都大于该标准,并把该标准排在这两组中间。[/align]
[align=justify] 第二步,采用同样的方法,对左边的组和右边的组进行排序,直到所有记录都排到相应的位置为止。[/align]

[align=justify]复杂度[/align]
[align=justify] 快速排序每次将待排序数组分为两个部分,在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要 logn次划分。[/align]
[align=justify] 而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度最好时为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为 O(nlogn)。[/align]

代码:

void Quick_Sort(int arr[],int low, int high)  //low 和high是数组的下标
{
if(NULL == arr)
return;
if(low<high)
{
int temp = arr[low];
int l=low,h=high;
while(l<h)
{
while(arr[h]>=t)     h--;
arr[l] = arr[h];
while(arr[l]<t)      l--;
arr[h] = arr[l];
}
arr[h] = temp;
Quick_Sort(A,low,h-1);
Quick_Sort(A,h+1,high);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: