目录
交换排序
1.基本思想
交换便是比对序列中两个数据的大小,根据两者的大小关系交换二者在序列中的位置。
其中是将数据较大的值向序列的尾部移动,数据较小的值向序列的首部移动。
2.冒泡排序
便是不断的较大数据后移,较小元素前移。
2.1.特性总结
- 时间复杂度:O(N^2);
- 空间复杂度:O(1);
- 稳定性:稳定
2.2.代码实现
#include<stdio.h>
#include<string.h>
void Swap(int *a, int *b){
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void BubbleSort(int arr[], int size){
for (int i = 0; i < size - 1; i++){
for (int j = 0; j < size - 1 - i; j++){
if (arr[j] > arr[j + 1]){
Swap(&arr[j], &arr[j + 1]);
}
}
}
}
void PrintSort(int arr[], int size){
for (int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[9] = { 9, 5, 6, 8, 3, 7, 4, 2, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, size);
PrintSort(arr, size);
return 0;
}
3.快速排序
任取待排序序列中的某个元素作为基准值,按照该数据将序列分割成为两个子列,左子列中数据均小于基准值,右子列中数据均大于基准值。
然后左右子列均重复上述过程,直到所有的元素均排列在合适位置上。
3.1.特性总结
- 快速排序整体性能和效率良好,所以适用范围较广
- 时间复杂度:O(N*logN);
- 空间复杂度:O(logN);
- 稳定性:不稳定。
3.2.代码实现
#include<stdio.h>
#include<string.h>
void Swap(int *a, int *b){
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
//取最左侧数据为key
int Partion(int arr[], int left, int right){
int begin = left;
int end = right - 1;
int key = arr[end];
while (begin < end){
while (begin < end && arr[begin] <= key)
begin++;
while (begin < end && arr[end] >= key)
end--;
if (begin < end){
Swap(&arr[begin], &arr[end]);
}
}
if (begin != right - 1)
Swap(&arr[begin], &arr[right - 1]);
return begin;
}
void QuickSort(int arr[], int left, int right){
if (right - left < 1)
return;
int dev = Partion(arr, left, right);
QuickSort(arr, left, dev);
QuickSort(arr, dev + 1, right);
}
void PrintSort(int arr[], int size){
for (int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[9] = { 9, 5, 6, 8, 3, 7, 4, 2, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = size;
QuickSort(arr, left, right);
PrintSort(arr, size);
return 0;
}
计数排序
2.1代码实现
#include<stdio.h>
#include<stdlib.h>
void CountSort(int arr[], int size){
int minVal = arr[0];
int maxVal = arr[0];
for (int i = 11; i < size; i++){
if (arr[i] < minVal)
minVal = arr[i];
if (arr[i] > maxVal)
maxVal = arr[i];
}
int range = maxVal - minVal + 1;
int *countArr = (int*)calloc(range, sizeof(int));
for (int i = 0; i < size; i++){
countArr[arr[i] - minVal]++;
}
int index = 0;
for (int i = 0; i < range; i++){
while (countArr[i] > 0){
arr[index] = i + minVal;
countArr[i]--;
index++;
}
}
free(countArr);
}
void PrintSort(int arr[], int size){
for (int i = 0; i < size; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 1, 3, 5, 7, 8, 9, 6, 4, 2, 3, 5, 6, 7, 1, 5, 9, 4, 6, 3, };
int size = sizeof(arr) / sizeof(arr[0]);
CountSort(arr, size);
PrintSort(arr, size);
return 0;
}