#include<iostream>
#include<assert.h>
using namespace std;
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void BubbleSort(int arr[], int size)
{
assert(arr);
int flags = 0;
//end控制每次循环的边界
for (int end =size - 1; end > 0; --end)
{
flags = 0;
for (int curr = 0; curr < end; ++curr)
{
//每次把最大的冒到最右边
if (arr[curr + 1] < arr[curr])
{
swap(arr[curr + 1], arr[curr]);
flags = 1;
}
}
//如果没有发生过一次交换,说明已经排好了
if (flags == 0)
break;
}
}
void InsertSort(int arr[], int size)
{
assert(arr);
for (int i = 0; i < size - 1; i++)
{
int j = i;
for (; j >= 0; --j)//注意j的边界条件,因为此时是j=i,所以应是j>=0
{
//交换次数较多
if (arr[j + 1] < arr[j])
swap(arr[j + 1], arr[j]);
else
break;
}
}
}
void InsertSort_1(int arr[], int size)
{
for (int i = 1; i < size; i++)
{
int tmp = arr[i];
int curr = i-1;
//一直移位到不满足条件,与上一个相比不用交换
while (curr >= 0 && tmp < arr[curr])//注意边界条件
{
arr[curr+1] = arr[curr];
--curr;
}
arr[curr+1] = tmp;//注意是arr[curr+1]=tmp
}
}
void SelectSort(int arr[],int size)
{
assert(arr);
for (int i = 0; i < size-1; i++)
{
int min = arr[i];
for (int j = i + 1; j < size; j++)
{
//最为普通的版本,交换操作过多
if (arr[j] < min)
{
min = arr[j];
arr[j] = arr[i];
arr[i] = min;
//swap(arr[i],arr[j]);
}
}
}
}
void SelectSort_1(int arr[],int size)
{
assert(arr);
for (int begin = 0; begin < size - 1; ++begin)
{
int min_index = begin;
for (int curr_index = begin + 1; curr_index < size; ++curr_index)
{
//一直找到最小值的下标,中间不需要交换
if (arr[min_index] > arr[curr_index])
{
min_index = curr_index;
}
}
//如果最小值不是第一个,交换
if (min_index != begin)
{
swap(arr[min_index], arr[begin]);
}
}
}
void SelectSort_2(int arr[],int size)
{
assert(arr);
int begin = 0;
int end = size - 1;
//一次找出最大值和最小值
while (begin < end)
{
int curr = begin;
while (curr < end)
{
//如果比begin还小,交换
if (arr[curr] < arr[begin])
{
swap(arr[curr], arr[begin]);
}
//如果比end还大,交换
if (arr[curr] > arr[end])
{
swap(arr[curr], arr[end]);
}
++curr;
}
++begin;
--end;
}
}
void main()
{
int a[] = {5,3,6,8,0,3,2,0,28,1};
//BubbleSort(a, sizeof(a) / sizeof(a[0]));//优化版本
//InsertSort(a, sizeof(a) / sizeof(a[0]));
//InsertSort_1(a, sizeof(a) / sizeof(a[0]));//优化版本,把交换改成移位
//SelectSort(a, sizeof(a) / sizeof(a[0]));
//SelectSort_1(a, sizeof(a) / sizeof(a[0]));//优化版本,把交换改成移位(找最小值的下标)
//SelectSort_2(a, sizeof(a) / sizeof(a[0]));//优化版本,一次循环同时找出最大值和最小值
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
cout << a[i] << "\t";
}
cout << endl;
}
简单排序算法
最新推荐文章于 2024-07-06 00:24:00 发布