#include <stdio.h>
#include <stdbool.h>
void swap(int* a, int* b);
void bubbleSort(int arr[], int ArrSize);
void cockTailSort(int arr[], int ArrSize);
void choiceSort(int arr[], int arrSize);
void insertSort(int arr[], int arrSize);
int main()
{
int arr[] = { 1,4,2,3,0,5,6,7,8,9,10,11,12 };
int ArrSize = sizeof(arr) / sizeof(int);
for (int i = 0; i < ArrSize; i++) printf("%d\t", arr[i]); printf("\n");
insertSort(arr, ArrSize);
//for (int i = 0; i < ArrSize; i++) printf("%d\t", arr[i]); printf("\n");
//return 0;
//bubbleSort(arr, ArrSize);
//choiceSort(arr, ArrSize);
for (int i = 0; i < ArrSize; i++) printf("%d\t", arr[i]); printf("\n");
//cockTailSort(arr, ArrSize);
//for (int i = 0; i < ArrSize; i++) printf("%d\t", arr[i]); printf("\n");
system("pause");
return 0;
}
void swap(int* a, int* b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
return;
}
/*
选择:扫描最小(大)元素放到序列起始作为已排序列
从剩下未排列元素中扫描最小(大)元素放到已排序列末尾
O(n^2) O(1) 不稳
*/
void choiceSort(int arr[], int arrSize)
{
for (int i = 0; i < arrSize; i++)
{
int minIndex = i;
for (int j = i + 1; j < arrSize; j++)
minIndex = (arr[j] < arr[minIndex]) ? j : minIndex;
swap(&arr[i], &arr[minIndex]);
}
}
/* 插入:抓牌从后往前比较,把小的放前面
o(n^2) O(1) 稳定
*/
void insertSort(int arr[], int ArrSize)
{
for (int i = 1; i < ArrSize; i++)
for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--)
swap(&arr[j], &arr[j - 1]);
}
/* 冒泡:相邻比较大的放后面作为已排序
重复上次操作,直到已排序
O(n^2) O(1) 稳定
*/
void bubbleSort(int arr[], int ArrSize)
{
int k = ArrSize - 1,n = 0;
int cnt = 0;
for (int i = 0; i < ArrSize - 1; i++)
{
bool flag = true; //默认有序,不需要交换
for (int j = 0; j + i < k; j++) //每一趟少循环一次
{
if (arr[j] > arr[j + 1])
{
flag = false; //已交换
swap(&arr[j], &arr[j + 1]);
n = j; //保存最后一次交换,小数下标
}
cnt++;
}
if (flag) break; //循环一趟一次都没有交换,减少趟次
k = n; //将他最为边界 ,减少交换次数
}
}
/* 两头冒泡 */
void cockTailSort(int arr[], int ArrSize)
{
int L = 0, R = ArrSize - 1;
while (L < R)
{
for (int i = L; i < R; i++) if (arr[i] > arr[i + 1]) swap(&arr[i], &arr[i + 1]);
for (int i = 0; i < ArrSize; i++) printf("%d\t", arr[i]); printf("\n");
R--;
for (int j = R; j > L; j--) if (arr[j] < arr[j - 1]) swap(&arr[j], &arr[j - 1]);
for (int i = 0; i < ArrSize; i++) printf("%d\t", arr[i]); printf("\n");
L++;
}
}
选择、冒泡、插入排序
最新推荐文章于 2022-05-20 10:16:25 发布