归并排序的时间复杂度:
将数列每一步都分开需要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");
}