主函数
int main(){
int a[] = {100, 5, 3, 1, 8, 7, 2, 4};
int n = sizeof(a)/sizeof(int);
cout << "原数组为:";
for (int i = 0; i < n; i++)
cout << a[i];
//Bubblesort(a,n);
//cocktailsort(a,n);
//choosesort(a,n);
//insertsort(a,n);
Binarysort(a, n);
return 0;
}
#include<iostream>
using namespace std;
void swap(int &a, int &b){
int temp;
temp = b;
b = a;
a = temp;
}
//冒泡排序
void Bubblesort(int *a,int n){
//冒泡排序主要是相邻比较将最大(或最小)移到一边
//最大的数排至最右边即从小到大
for (int i = 0; i < n - 1;i++)//需要n-1轮
for (int j = 0; j < n - i - 1; j++)
{
if (a[j]>a[j + 1])
swap(a[j],a[j+1]);
}
cout << "冒泡排序后的序列为:";
for (int k = 0; k < n; k++)
cout << a[k];
}
//冒泡法改进:鸡尾酒排序:向右将最大的数冒出,向左将最小的数冒出
void cocktailsort(int *a,int n){
int k = 0;
int i = 900;
int j = 0;
while (i-j>1){
for (i = k; i < n-k; i++)
{
if (a[i]>a[i + 1])
swap(a[i], a[i + 1]);
}
for (j = n -k-1; j >= k; j--)
{
if (a[j] < a[j - 1])
swap(a[j],a[j-1]);
}
k++;
}
cout << "鸡尾酒排序后的序列为:";
for (int i = 0; i < n; i++)
cout << a[i];
}
//选择排序:找最大或者最小放到最左或者最右,重复N-1次即可把n个数排序
//这里把最大的数放最右边
void choosesort(int *a,int n){
int temp=0;
int i, j;
for (i = 0; i < n-1; a[n - 1 - i] = temp,i++)
for (j = 0; j < n-i-1; j++)
{
if (a[j]>a[j + 1])
temp = a[j];
else
temp = a[j + 1];
}
cout << "选择排序后的序列为:";
for (int i = 0; i < n; i++)
cout << a[i];
}
//插入排序:插入排序主要是将无序数与有序队列比较,选择合适位置插入
void insertsort(int *a,int n){
//第一个数开始为有序队列,后的数为无序队列,这里按照从小到大排列
int temp=0;
int j = 0;
for (int i = 1; i < n; i++)
{
temp = a[i];
j = i;
while (temp < a[j - 1] && j >= 0)
{
swap(temp, a[j - 1]);
temp = a[j - 1];
j--;
}
}
cout << "插入排序后的序列为:";
for (int i = 0; i < n; i++)
cout << a[i];
}
//插入排序改进:二分插入排序
//适用于数比较多的情况,此时比较次数比较多,二分插入不用一个一个的比较,而是不断的用二分法确定无序数的区间范围
void Binarysort(int *a,int n){
int i, j, low, high, mid;
int temp;
for (i = 1; i <n; i++)
{
temp = a[i];
low = 0;
high = i - 1;
while (low <= high)
{
mid = (low+high) / 2;
if (temp < a[mid])
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= low;j--)
a[j + 1] = a[j];
a[low] = temp;
}
cout << "二分插入排序后的序列为:";
for (int i = 0; i < n; i++)
cout << a[i];
}
//shell排序,插入排序的更高改进,又叫缩小增量排序法