面试常见问题,手撕快排、归并排序,或者手写一些查找算法,比如二分查找等。
本片及下篇博客将分别总结常见的排序算法和查找算法,主要是基于C或者C++。
这些问题本质都不难,只要勤加练习,充分理解,方能记于心中。
1、冒泡排序
#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
void bubbleSort(int *array, int len)
{
int tmp = 0;
bool flag = false;
for (int i = 0; i < len - 1; i++) {
flag = false;
for (int j = len - 1; j > i; j--) {
if (array[j-1] > array[j]) {
tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
flag = true;
}
}
if (!flag) {
break;
}
}
return;
}
#define len 10
int main()
{
int array[len] = {10, 8, 9, 5, 6, 7, 2, 1, 4, 3};
bubbleSort(array, len);
for (int i = 0; i < len; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
}
2、简单选择排序
3、直接插入排序
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define tostr(x) #x
void shellSort(int *array, int len, char *order)
{
if (array == NULL || len == 1) {
return;
}
int tmp,j;
for (int i = 1; i < len; i++) {
j = i;
tmp = array[i];
if (strcmp(order, tostr(up)) == 0) {
while ((j > 0) && (tmp < array[j-1])) {
array[j] = array[j-1];
j--;
}
} else if (strcmp(order, tostr(up)) == 0) {
while ((j > 0) && (tmp > array[j-1])) {
array[j] = array[j-1];
j--;
}
}
array[j] = tmp;
}
return;
}
/* 浣跨敤璇存槑锛?
* 1. gcc straightInsertSort.c -o straightInsertSort
* 2. 鍗囧簭鎺掑垪锛?./straightInsertSort up
* 3. 鍗囧簭鎺掑垪锛?./straightInsertSort down
*/
#define len 10
int main(int argc, char **argv)
{
int array[len] = {10, 8, 9, 5, 6, 7, 2, 1, 4, 3};
shellSort(array, len, argv[1]);
for (int i = 0; i < len; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
}
4、希尔排序
/*
* shell排序
* 1. 分组 len/2
* 2. 插排 对分组后的每组进行插入排序,注意插入起点和步距
* 3. 组数和步距相同
*/
#include <stdio.h>
void printArr(int *array, int len)
{
int i;
for (i = 0; i < len; i++) {
printf("%d ", array[i]);
}
printf("\n");
return;
}
void shellSort(int *array, int len)
{
int j;
for (int step = len/2; step >= 1; step /= 2) {
for (int group = 0; group < step; group++) { /* 对每组进行插排处理 */
for (int i = group; i < len - step; i += step) {
int InsertEle = array[i + step];
j = i + step;
while ((j - step >= 0) && (InsertEle < array[j-step])) {
array[j] = array[j-step];
j -= step;
}
array[j] = InsertEle;
}
printArr(array, len);
}
}
return;
}
#define len 2
int main(int argv, char **argc)
{
int array[len] = {5, 2};
printArr(array, len);
shellSort(array, len);
printArr(array, len);
}
5、快速排序

#include <stdio.h>
void printArr(int *array, int len)
{
int i;
for (i = 0; i < len; i++) {
printf("%d ", array[i]);
}
printf("\n");
return;
}
int getMid(int *array, int head, int tail)
{
int referenceData = array[head];
while (head != tail) {
while (array[tail] > referenceData && head < tail) {
tail--;
}
array[head] = array[tail];
while (array[head] <= referenceData && head < tail) {
head++;
}
array[tail] = array[head];
}
array[head] = referenceData;
printf("mid = %d\n", head);
return head;
}
void quickSort(int *array, int head, int tail)
{
if (head < tail) {
int mid = getMid(array, head, tail);
quickSort(array, head, mid-1);
quickSort(array, mid+1, tail);
}
return;
}
#define len 7
int main(int argv, char **argc)
{
int array[len] = { 6, 5, 6, 8, 9, 2, 15 };
printArr(array, len);
quickSort(array, 0, len-1);
printArr(array, len);
}
6、堆排序
7、归并排序
参考文章:https://www.cnblogs.com/chengxiao/p/6194356.html
感觉这两张图片写到很长好,分治法。

void mergeSortArray(int *array, int head, int mid, int tail, int *buffer)
{
int head_s = head;
int tail_s = tail;
int mid_s = mid + 1;
int bufferIndex = 0;
while (head_s <= mid && mid_s <= tail)
{
if (array[head_s] < array[mid_s]) {
buffer[bufferIndex++] = array[head_s++];
} else {
buffer[bufferIndex++] = array[mid_s++];
}
}
while (head_s <= mid)
{
buffer[bufferIndex++] = array[head_s++];
}
while (mid_s <= tail)
{
buffer[bufferIndex++] = array[mid_s++];
}
for (int i = 0; i < bufferIndex; i++) {
array[head + i] = buffer[i];
}
}
/* 调用入口 */
void mergeSort(int *array, int head, int tail, int *buffer)
{
if (head < tail) {
int mid = (head + tail) / 2;
mergeSort(array, head, mid, buffer);
mergeSort(array, mid+1, tail, buffer);
mergeSortArray(array, head, mid, tail, buffer);
}
}
8、桶排序
本文详细解析了八大经典排序算法,包括冒泡排序、简单选择排序、直接插入排序、希尔排序、快速排序、堆排序、归并排序和桶排序。通过C/C++代码实现,深入浅出地讲解了算法原理和应用场景。


2万+

被折叠的 条评论
为什么被折叠?



