总结2
算法二分法例子
排序算法数据结构实现升序动态数组
算法
1.暴力法 2.二分法:一次处理筛选一半 3.动态规划 4.回溯法 5.贪婪算法
二分法例子
#include <stdio.h>
int selectPos(int* arr
, int len
, int data
)
{
int l
= 0, r
= len
- 1;
while(l
<= r
){
int m
= (l
+ r
) / 2;
if(arr
[m
] == data
){
return m
;
}
else if(arr
[m
] > data
){
r
= m
-1;
}else{
l
= m
+ 1;
}
}
return -1;
}
int main(void)
{
int arr
[] = {3,4,5,6,7,8,9};
int val
= 0;
printf("请输入要查找的数:");
scanf("%d", &val
);
printf("要查找的数在数组中的下标为:%d\n", selectPos(arr
, sizeof(arr
) / sizeof(int), val
));
return 0;
}
排序算法
时间复杂度最大次数稳定性
冒泡排序n^2n^2稳定选择排序n^2n^2不稳定插入排序n^2n^2稳定快速排序n long(n)n^2不稳定归并排序(链表)n long(n)n long(n)稳定
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N (10)
int arr
[N
];
void bubbleSort(int* arr
, int len
);
void selectSort(int* arr
, int len
);
void insertSort(int* arr
, int len
);
void quickSort(int* arr
, int len
);
int main(void)
{
srand(time(0));
int i
;
for(i
= 0; i
< N
; i
++){
arr
[i
] = rand() % N
;
}
bubbleSort(arr
, N
);
for(i
= 0; i
< N
; i
++){
printf("%d ", arr
[i
]);
}
printf("\n");
for(i
= 0; i
< N
; i
++){
arr
[i
] = rand() % N
;
}
selectSort(arr
, N
);
for(i
= 0; i
< N
; i
++){
printf("%d ", arr
[i
]);
}
printf("\n");
for(i
= 0; i
< N
; i
++){
arr
[i
] = rand() % N
;
}
insertSort(arr
, N
);
for(i
= 0; i
< N
; i
++){
printf("%d ", arr
[i
]);
}
printf("\n");
for(i
= 0; i
< N
; i
++){
arr
[i
] = rand() % N
;
}
quickSort(arr
, N
);
for(i
= 0; i
< N
; i
++){
printf("%d ", arr
[i
]);
}
printf("\n");
return 0;
}
void bubbleSort(int* arr
, int len
)
{
int i
, j
;
for(i
= 0; i
< len
- 1; i
++){
for(j
= 0; j
< len
- i
- 1; j
++){
if(arr
[j
] > arr
[j
+1]){
int tem
= arr
[j
];
arr
[j
] = arr
[j
+1];
arr
[j
+1] = tem
;
}
}
}
return;
}
void selectSort(int* arr
, int len
)
{
int i
, j
;
for(i
= 0; i
< len
- 1; i
++){
int min
= i
;
for(j
= i
+ 1; j
< len
; j
++){
if(arr
[min
] > arr
[j
]){
min
= j
;
}
}
if(i
!= min
){
int temp
= arr
[min
];
arr
[min
] = arr
[i
];
arr
[i
] = temp
;
}
}
return;
}
void insertSort(int* arr
, int len
)
{
int i
, j
;
for(i
= 1; i
< len
; i
++){
int tmp
= arr
[i
];
for(j
= i
-1; j
>= 0 && tmp
< arr
[j
]; j
--){
arr
[j
+1] = arr
[j
];
}
arr
[j
+1] = tmp
;
}
}
static void quickSortPrivate(int* arr
, int left
, int right
)
{
if(left
>= right
){
return;
}
int l
= left
, r
= right
, key
= arr
[left
];
while(l
< r
){
while(l
< r
&& key
<= arr
[r
]){
r
--;
}
arr
[l
] = arr
[r
];
while(l
< r
&& key
>= arr
[l
]){
l
++;
}
arr
[r
] = arr
[l
];
}
arr
[l
] = key
;
quickSortPrivate(arr
, left
, l
- 1);
quickSortPrivate(arr
, r
+ 1, right
);
}
void quickSort(int* arr
, int len
)
{
quickSortPrivate(arr
, 0, len
- 1);
}
数据结构
数据结构:解决多个数据的有效管理->增删改查排 从结构[数据存储结构]上来看,数据结构两种:数组、链表 从功能[数据存储方式]上来看,数据结构两种:线性、关联 结构:1.连续内存存放[数组] 2.不连续内存存放[链表] 特点:数组因为内存连续,因此可以下标访问 链表因为内存不连续,因此增删不需要移动数据 功能: 1.线性数据结构表示插入数据的顺序,直接关系到数据的位置 2.关联数据结构表示插入数据的大小,直接关系到数据的位置
实现升序动态数组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct Array
{
int* data
;
int idx
;
int capa
;
}array_t
;
array_t
* arrayInit(void);
void arrayFree(array_t
* array
);
int* arrayPushBack(array_t
* array
, int data
);
void arrayPopBack(array_t
* array
);
int* arrayIndex(array_t
* array
, int idx
);
void arraySort(array_t
*, int (*compare
)(int, int));
int main()
{
array_t
* arr
= arrayInit();
int i
;
for(i
= 0; i
< 10; i
++){
arrayPushBack(arr
, rand() % 10);
}
arraySort(arr
, NULL);
for(i
= 0; i
< 10; i
++){
printf("%d\n", *arrayIndex(arr
, i
));
}
arrayFree(arr
);
arr
= NULL;
return 0;
}
array_t
* arrayInit(void)
{
array_t
* array
= (array_t
*)malloc(sizeof(array_t
));
memset(array
, 0, sizeof(array_t
));
array
->idx
= 0;
array
->capa
= 1;
array
->data
= malloc(sizeof(int) * array
->capa
);
memset(array
->data
, 0,sizeof(int) * array
->capa
);
return array
;
}
void arrayFree(array_t
* array
)
{
if(array
== NULL)return;
free(array
->data
);
free(array
);
}
int* arrayPushBack(array_t
* array
, int data
)
{
if(array
== NULL) return NULL;
if(array
->idx
== array
->capa
){
array
->capa
*= 2;
array
->data
= (int*) realloc(array
->data
, sizeof(int) * array
->capa
);
memset(array
->data
+ array
->idx
, 0, sizeof(int) * array
->idx
);
}
array
->data
[array
->idx
++] = data
;
return &array
->data
[array
->idx
- 1];
}
void arrayPopBack(array_t
* array
)
{
if(array
== NULL) return;
if(--(array
->idx
) < 0) array
->idx
= 0;
array
->data
[array
->idx
] = 0;
}
int* arrayIndex(array_t
* array
, int idx
)
{
if(array
== NULL) return NULL;
return &(array
->data
[idx
]);
}
static void quickSortPrivate(int* arr
, int left
, int right
, int (*compare
)(int,
int))
{
if(left
>= right
) return;
int l
= left
, r
= right
, key
= arr
[left
];
while(l
< r
){
if(compare
) while(l
< r
&& compare(arr
[r
], key
) >= 0) r
--;
else while(l
< r
&& arr
[r
] >= key
) r
--;
arr
[l
] = arr
[r
];
if(compare
) while(l
< r
&& compare(arr
[l
], key
) <= 0) l
++;
else while(l
< r
&& arr
[l
] <= key
) l
++;
arr
[r
] = arr
[l
];
}
arr
[l
] = key
;
quickSortPrivate(arr
, left
, l
-1, compare
);
quickSortPrivate(arr
, r
+1, right
, compare
);
}
void arraySort(array_t
* array
, int(*compare
)(int, int))
{
if(array
== NULL) return;
quickSortPrivate(array
->data
, 0, array
->idx
- 1, compare
);
}