shell 排序
1.插入排序的优化
2.步长:一开始设置为 元素个数/2
3.步长次排序:每次排序完,步长减一
每次排序都以步长为间隔给所有元素分组,组内作插入排序。
function.cpp中包括了冒泡排序,插入排序,选择排序,shell排序
#include "function.h"
void sawp(int &a,int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
/*冒泡排序*/
void Sort(int a[], unsigned int num)
{
if(num<=1)return;
for (int j = 0; j<num-1; ++j)
{
for (int i = 0; i < num-1-j; i++)
{
if (a[i]>a[i+1])
{
sawp(a[i], a[i+1]);
}
}
}
return;
}
/*选择排序*/
void Sort_2(int a[], unsigned int num)
{
int min_num;
if(num<=1)return;
for (int j=0; j<num-1; j++)
{
min_num = j;
for (int i = j+1; i < num; i++)
{
if (a[i]<a[min_num])
{
min_num = i;
}
}
sawp(a[j],a[min_num]);
}
return;
}
/*插入排序1*/
void Sort_3(int a[], unsigned int num)
{
if(num<=1)return;
for (int i=1; i<num; i++)
{
for (int j = i; j > 0;j--)
if (a[j-1] > a[j])
{
sawp(a[j] , a[j-1]);
}
else
break;
}
return;
}
/*插入排序2*/
void Sort_4(int a[], unsigned int num)
{
int temp;
int j;
for (int i = 1; i < num; i++)
{
temp = a[i];
j = i - 1;
while(a[j]>temp&&j>=0){
a[j+1] = a[j];
j--;
}
a[j + 1] = temp;
}
}
/*shell排序:是插入排序的优化*/
void shell_sort(int a[], unsigned int num)
{
int step;
int temp;
int j;
step = num / 2;
while(step>=1)
{
for (int i = 1; i<step; i++)
{
temp = a[i];
j = i - step;
while(a[j]>temp && j>=0)
{
a[j + step] = a[j];
j -= step;
}
a[j+step] = temp;
}
step = step / 2;
}
}
function.h
#ifndef FUNCTION_H
#define FUNCTION_H
void sawp(int &a, int &b);
void Sort(int a[], unsigned int num);
void Sort_2(int a[], unsigned int num);
void Sort_3(int a[], unsigned int num);
void Sort_4(int a[], unsigned int num);
void shell_sort(int a[], unsigned int num);
#endif
sort.cpp测试程序(随机生成10个数,测试各种排序算法)
#include <iostream>
#include <string>
#include <cstdlib>
#include "stdlib.h"
#include <time.h>
#include "function.h"
using namespace std;
#define NUMBER 10
int main()
{
int a = 0;
int b = 50;
int t;
int aim[NUMBER];
srand((unsigned int ) time(NULL));
for (size_t i = 0; i < NUMBER; i++) //产生10个随机数
{
t = (rand() % (b - a + 1)) + a;
cout << t << endl;
aim[i] = t;
}
// Sort(aim, NUMBER);
// Sort_2(aim, NUMBER);
// Sort_3(aim, NUMBER);
Sort_4(aim,NUMBER);
cout << "start" << endl;
for (size_t i = 0; i < NUMBER; i++)
{
cout << aim[i] << endl;
}
}
基数排序:空间复杂度高,时间复杂度最低,但是使用有限制,数组的值不能为负数,小数,排序数字不能重复,而且要事先知道数据的最大值。
/*基数排序,空间复杂度高,时间复杂度最低*/
void radix_sort(int a[], unsigned int length, int max)
{
//创建一个临时数组
int *b = new int[max+1];
int j = 0;
//数组b初始化
for (int i = 0; i < max; i++)
b[i] = -1;
for (int i = 0; i<length; i++)
b[a[i]]=a[i];
for (int i = 0; i < max+1; i++)
{
if (b[i]!=-1)
{
a[j] = b[i];
printf("i:%d, j:%d, a[j]:%d, b[i]:%d\n", i, j, a[j], b[i]);
j++;
}
}
delete[] b;
}
桶排序:是基数排序的一种优化,创建几个桶并且对桶进行编号(0~9),把每个数的取出个位,按顺序放入对应编号的桶中,得出一组排序结果。
在第一次排序结果的基础上,取出十位,放入桶内排序,得出第二次的排序结果
在第二次排序结果的基础上,取出百位,放入桶内排序,得出第3次的排序结果,排序完成。
/*桶排序*/
#include <cstring>
#define NUMBER 10
#define PEACK 1000
void bucket_sort(int a[], unsigned int num)
{
for (int k = 1; k < PEACK; k*=10){
//定义10个桶,每个桶里放10个数
int temp[10][10];
//初始化10个桶里面的数据
memset(temp, -1, sizeof(int) *10*10);
//将个位,十位,百位取出,赋值给temp素组
for (int i = 0; i < num; i++)
{
int m = a[i] / k % 10;
temp[m][i] = a[i];
}
int p = 0;
//把temp数组赋值给a数组
for (int i = 0; i < num; i++)
{
for (int j = 0; j < 10; j++)
{
if (temp[i][j] != -1)
a[p++] = temp[i][j];
}
}
for(int i = 0; i < num; i++)
{
printf("a[%d]=%d ", i, a[i]);
}
printf("\n");
}
}
int main()
{
int aim2[10] = {99, 12, 687, 431, 32, 0, 45, 76, 62, 231};
for(int i=0; i<10; i++)
{
printf("aim2[i]=%d, ", i, aim2[i]);
}
printf("\n");
bucket_sort(aim2, NUMBER);
cout << "start" << endl;
for (size_t i = 0; i < NUMBER; i++)
{
cout << aim2[i] << endl;
}
}