数据结构与算法
来源:互联网 发布:淘宝女装店简介范文 编辑:程序博客网 时间:2024/04/29 04:24
归并排序的时间复杂度:
将数列每一步都分开需要logN;每一步都是一个归并小数列的过程O(N),所以一共为N*LOG N
空间复杂度是O(N)
void merge(int a[],int start,int mid,int end,int temp[])
{
int i = start, j = mid + 1, k = 0;
while (i <= mid && j <= end)
{
if (a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= mid)
temp[k++] = a[i++];
while (j <= end)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[i + start] = temp[i];
}
void MergeSort(int a[],int low,int high,int temp[])
{
int mid = 0;
if (low < high)
{
mid = (low + high) / 2;
MergeSort(a, low, mid, temp);
MergeSort(a, mid + 1, high, temp);
merge(a,low,mid,high,temp);
}
}
快速排序:
算法:分治法
核心思想是:
1.在数列中去一个数作为基准数
2.进行分区,然后再分区的过程中,比基准数小的放在左边,大的放在右边
3.重复进行以上操作,知道区间中只有一个数为止
解决思路,挖坑填数+分治法
时间复杂度的分析:n*LOGN
最坏的情况下会O(N^2):在基本有序的情况下
#include <iostream>
using namespace std;
int partion(int array[], int low, int high)
{
int key = array[low];
int i = low, j = high;
while (i < j)
{
while (i<j && array[j] >= key)j--;
if (i < j)
array[i++] = array[j];
while (i<j && array[i] < key)i++;
if (i < j)
array[j--] = array[i];
}
array[i] = key;
return i;
}
void quickSort(int array[],int low,int high)
{
if (low < high)
{
int mid = partion(array, low, high);
quickSort(array, low, mid - 1);
quickSort(array, mid + 1, high);
}
}
void print(int a[],int n)
{
int i = 0;
for (i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}
void main()
{
int a[10] = { 24, 998, 5, 645, 345, 4656, 4565, 4, 2, 43 };
print(a, 10);
quickSort(a, 0,9);
print(a, 10);
system("pause");
}
将数列每一步都分开需要logN;每一步都是一个归并小数列的过程O(N),所以一共为N*LOG N
空间复杂度是O(N)
void merge(int a[],int start,int mid,int end,int temp[])
{
int i = start, j = mid + 1, k = 0;
while (i <= mid && j <= end)
{
if (a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= mid)
temp[k++] = a[i++];
while (j <= end)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[i + start] = temp[i];
}
void MergeSort(int a[],int low,int high,int temp[])
{
int mid = 0;
if (low < high)
{
mid = (low + high) / 2;
MergeSort(a, low, mid, temp);
MergeSort(a, mid + 1, high, temp);
merge(a,low,mid,high,temp);
}
}
快速排序:
算法:分治法
核心思想是:
1.在数列中去一个数作为基准数
2.进行分区,然后再分区的过程中,比基准数小的放在左边,大的放在右边
3.重复进行以上操作,知道区间中只有一个数为止
解决思路,挖坑填数+分治法
时间复杂度的分析:n*LOGN
最坏的情况下会O(N^2):在基本有序的情况下
#include <iostream>
using namespace std;
int partion(int array[], int low, int high)
{
int key = array[low];
int i = low, j = high;
while (i < j)
{
while (i<j && array[j] >= key)j--;
if (i < j)
array[i++] = array[j];
while (i<j && array[i] < key)i++;
if (i < j)
array[j--] = array[i];
}
array[i] = key;
return i;
}
void quickSort(int array[],int low,int high)
{
if (low < high)
{
int mid = partion(array, low, high);
quickSort(array, low, mid - 1);
quickSort(array, mid + 1, high);
}
}
void print(int a[],int n)
{
int i = 0;
for (i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}
void main()
{
int a[10] = { 24, 998, 5, 645, 345, 4656, 4565, 4, 2, 43 };
print(a, 10);
quickSort(a, 0,9);
print(a, 10);
system("pause");
}
0 0
- 数据结构与算法 -- 算法
- 【数据结构与算法】浅谈数据结构与算法
- 【数据结构与算法】【Some】数据结构与算法
- 数据结构笔记-----数据结构与算法
- 【数据结构与算法】数据结构备忘
- 数据结构与算法总论
- 数据结构与算法总论
- 数据结构与算法基础
- 数据结构与算法总论
- 数据结构与算法
- 数据结构与算法基础
- 数据结构与算法笔记
- 数据结构与算法
- 数据结构与算法
- 数据结构与算法
- 算法与数据结构简介
- 数据结构与算法
- 数据结构与算法(1)
- File类的用法
- LeetCode_Tree_Populating Next Right Pointers in Each Node I II
- 一起talk C栗子吧(第四十七回:C语言实例--走迷宫一)
- LeetCode题解:Permutations
- fragment(一)
- 数据结构与算法
- 十六进制颜色值参考
- 漫谈C指针第九讲---参数的值传递
- Android 简单图片浏览器(疯狂Android讲义第三版)
- HDU 1405 The Last Practice(求质因子及其个数 )
- 全国青少年信息学奥林匹克分区联赛(N)竞赛大纲
- Linux 文件系统结构介绍[图解]
- POJ1003 水题不解释
- Postgresql9.4.4 Install&Configure