數據結構與算法

歸併排序的時間複雜度:


將數列每一步都分開需要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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章