#include<iostream>
using namespace std;
void swap(int* a, int* b){
int temp = *a;
*a = *b;
*b = temp;
}
void bubble_sort1(int nums[],int len){
for (int i = 0; i < len; i++){
for (int j = len - 1; j>i; j--){
if (nums[j] < nums[j - 1])
swap(&nums[j], &nums[j - 1]);
}
}
}
void bubble_sort2(int nums[], int len){
bool flag = true; //flag用来作为标记
for (int i = 0; i < len&&flag; i++){ //若flag为true说明有过数据交换,否则停止循环
flag = false;
for (int j = len - 1; j>i; j--){
if (nums[j] < nums[j - 1]){
swap(&nums[j], &nums[j - 1]);
flag = true;
}
}
}
}
void selection_sort(int nums[], int len){
int min;
for (int i = 0; i < len; i++){
min = i;
for (int j = i + 1; j < len; j++){
if (nums[min]>nums[j])
min = j;
}
if (i != min)
swap(&nums[i], &nums[min]);
}
}
void insert_sort(int nums[], int len){
for (int i = 1; i < len; i++){
int j;
int temp = nums[i];
for (j = i - 1; j >= 0 && nums[j]>temp; j--)
nums[j + 1] = nums[j];//记录后移
nums[j + 1] = temp;//插入到正确位置
}
}
void shell_sort(int nums[], int len){
int increment = len / 2; //增量序列
while (increment >= 1){
for (int i = increment; i < len; i++){
int j;
int temp = nums[i];
//对距离为increment的元素组进行插入排序
for (j = i - increment; j >= 0 && nums[j]>temp; j -= increment)
nums[j + increment] = nums[j];
nums[j + increment] = temp;
}
increment /= 2; //减小增量
}
}
void print_array(int nums[], int len){
for (int i = 0; i < len; i++)
cout << nums[i] << ' ';
cout << endl;
}
int main(){
int nums1[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
int len1 = sizeof(nums1) / sizeof(int);
bubble_sort1(nums1, len1);
print_array(nums1, len1);
int nums2[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
int len2 = sizeof(nums2) / sizeof(int);
bubble_sort2(nums2, len2);
print_array(nums2, len2);
int nums3[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
int len3 = sizeof(nums3) / sizeof(int);
selection_sort(nums3, len3);
print_array(nums3, len3);
int nums4[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
int len4 = sizeof(nums4) / sizeof(int);
insert_sort(nums4, len4);
print_array(nums4, len4);
int nums5[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
int len5 = sizeof(nums5) / sizeof(int);
shell_sort(nums5, len5);
print_array(nums5, len5);
return 0;
}