各种排序方法复杂度总结归纳
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
各种排序方法复杂度总结归纳
一、冒泡排序
主要思路是:
通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。
代码实现
void buadfdsle_sort(int arr[],int len)
{
for (int i = 0; i {
for (int j = len —1; j >= i; j——)
{
if (arr[j] {
int temp = arr[j];
arr[j] = arr[j —1];
arr[j —1] = temp;
}
}
}
}
冒泡排序改进1:
在某次遍历中,如果没有数据交换,说明整个数组已经有序,因
此通过设置标志位来记录此次遍历有无数据交换就可以判断是否要继续循环。
冒泡排序改进2:
记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序。因此设置标志位记录每次遍历中最后发生数据交换的位置可以确定下次循环的范围。
二、直接插入排序
主要思路是:
每次将一个待排序的数组元素,插入到前面已排序的序列中这个元素应该在的位置,直到全部数据插入完成。类似扑克牌洗牌过程。
代码实现
void _sort(int arr[],int len)
{
for (int i = 1; i {
int j = i —1;
int k = arr[i];
while (j > —1 && k {
arr[j + 1] = arr[j];
j ——;
}
arr[j + 1] = k;
}
}
三、直接选择排序
主要思路是:
数组分成有序区和无序区,初始时整个数组都是无序区,每次遍历都从无序区选择一个最小的元素直接放在有序区最后,直到排序完成。
代码实现
void select_sort(int arr[],int len)
{
for (int i = 0; i {
int index = i;
for (int j = i + 1; j {
if (arr[j] index = j;
}
if (index != i)
{
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
}
四、快速排序
主要思路是:
“挖坑填数+ 分治法”,首先令i = L;j = R;将a[i]挖出形成打一个坑,称a[i]为基准数。然后j——从后向前找到一个比基准数小的数,挖出来填到a[i]的坑中,这样a[j]就形成了一个新的坑,再i++从前向后找到一个比基准数大的数填到a[j]坑中。重复进行这种挖坑填数,直到i = j。这时a[i]形成了一个新的坑,将基数填到a[i]坑中,这样i 之前的数都比基准数小,i之后的数都比基准数大。因此将数组分成两部分再分别重复上述步骤就完成了排序。
代码实现
void quick_sort(int arr[],int left,int right)
{
if (left {
int i = left,j = right,target = arr[left];
while (i {
while (i target)
j——;
if (i arr[i++] = arr[j];
while (i i++;
if (i arr[j] = arr[i];
}
arr[i] = target;
quick_sort(arr,left,i —1);
quick_sort(arr,i + 1,right);
}
}
五、希尔排序
主要思路是:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。由于希尔排序是对相隔若干距离的数据进行直接插入排序,因此可以形象的称希尔排序为“跳着插”。
六、归并排序
主要思路是:
当一个数组左边有序,右边也有序,那合并这两个有序数组就完成了排序。如何让左右两边有序了?用递归!这样递归下去,合并上来就是归并排序。
代码实现
void merge(int arr[],int temp_arr[],int start_index,int mid_index,int end_index)
{
int i = start_index,j = mid_index + 1;
int k = 0;
while (i {
if (arr[i] > arr[j])
temp_arr[k++] = arr[j++];
else
temp_arr[k++] = arr[i++];
}
while (i {
temp_arr[k++] = arr[i++];
}
while (j temp_arr[k++] = arr[j++];
for (i = 0,j = start_index; j arr[j] = temp_arr[i];
}
void merge_sort(int arr[],int temp_arr[],int start_index,int end_index)
{
if (start_index {
int mid_index = (start_index + end_index)/ 2;
merge_sort(arr,temp_arr,start_index,mid_index);
merge_sort(arr,temp_arr,mid_index + 1,end_index);
merge(arr,temp_arr,start_index,mid_index,end_index);
}
}