冒泡排序:
内外循环:如果前一个数比后一个数大或者小,则交换顺序。
核心:嵌套循环+比较+交换。
多次比较,多次交换。内循环多次交换导致搬运影响时间。
void MyBubbleSort(int* p, int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len-i-1; j++)
{
if ((*(p + j)) < (*(p + j + 1)))
{
int temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
}
}
}
选择排序:
假定起始位置为最值。然后内外循环,如果发现一个值比最值还最,那么记录这个位置。等循环结束交换他俩的位置。
核心:多次比较,但是每次内循环玩只搬运一次。比冒泡搬运少。
算是冒泡的改良版。
void Selectsort(char **arr,int len)
{
for (int i = 0; i < len; ++i)
{
int min = i; // 标记最值下标索引。
for (int j = i + 1; j < len; ++j)
{
//arr[j]>arr[min]就返回大于0,
//现在是从大到小排序
if (strcmp(arr[j], arr[min])>0)
{
min = j;
}
}
// 每次循环只交换一次
char *temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
插入排序:
思路:将无序序列中的元素逐个插入到有序序列中。
从思路看,需要两个序列,一个无序序列,一个有序序列。无序序列就是待排序序列,这个有序序列从哪里来?
如何构建有序序列?
我们初始化时,将第一个元素作为有序序列。
此时,下标遍历从1开始。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void printArray(int arr[],int len)
{
for (int i = 0; i < len; ++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void InsertSort(int arr[],int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
for (; j >= 0 && temp > arr[j]; j --)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
void test()
{
int arr[] = { 5, 3, 9, 2, 1, 3 };
int len = sizeof(arr) / sizeof(int);
printArray(arr, len);
InsertSort(arr, len);
printArray(arr, len);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}