交换排序(冒泡排序、快速排序)
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]
快速排序
快速排序是对冒泡排序的一种改进。
它的基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
排序过程:
[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]
代码:
[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); } }
相关文章推荐
- 【Java常用排序算法】交换排序(冒泡排序、快速排序)
- 交换排序---冒泡排序和快速排序
- 交换排序(冒泡排序,快速排序)
- 算法分析-交换排序(冒泡排序 & 快速排序)
- 1.交换排序(冒泡排序和快速排序)
- 交换排序中冒泡排序和快速排序的简单比较
- 交换排序--冒泡排序和快速排序
- 简单的排序算法——插入排序,选择排序,交换排序(冒泡排序,快速排序)
- 排序算法(三):交换排序(冒泡排序、快速排序)
- 交换排序(冒泡排序 and 快速排序)
- 交换排序(冒泡排序,快速排序)
- 交换排序实现(冒泡排序,快速排序)
- 常见的排序算法(三) 交换排序(冒泡排序,快速排序)
- 交换排序之冒泡排序与快速排序
- 交换排序——冒泡排序和快速排序
- 【排序】交换排序(冒泡排序、快速排序)
- 交换排序(冒泡排序—改进、快速排序)
- 编程菜鸟的日记-初学尝试编程-整理内部排序(交换排序(冒泡排序和快速排序)、直接选择排序、直接插入排序,希尔排序)
- 交换排序(冒泡排序、快速排序)
- 算法排序-交换排序(冒泡排序,快速排序)