归并排序和快速排序是面试中常见的两种排序。
归并排序 (从小到大排序),时间:平均与最差为O(nlog(n)),空间:看情况
//将有二个有序数列a[first...mid]和a[mid+1...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] < a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}
bool MergeSort(int a[], int n)
{
int *pTempArray = new int[n];
if (pTempArray == NULL)
return false;
mergesort(a, 0, n - 1, pTempArray);
delete[] pTempArray;
return true;
}
快速排序(从小到大),平间:平均O(nlog(n)),最差O(n^2),空间:O(log(n))。
void quick_sort_Core(int s[], int l, int r)
{
int i, j, x;
if (l < r)
{
i = l, j = r, x = s[l];
while (i < j)
{
while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if (i < j)
s[i++] = s[j];
while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;//此时 i==j
quick_sort_Core(s, l, i - 1); // 递归调用
quick_sort_Core(s, i + 1, r); // 递归调用
}
}
void quick_sort(int s[], int length)
{
if (length <= 0 || s == nullptr)
return;
quick_sort_Core(s,0,length-1);
}