#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 18 //数组大小
void print(int *p);
//随机生成数据,初始化数组
void init(int *p){
if(NULL == p)
return;
srand(time(0));
for(int i = 0; i < SIZE; i++){
p[i] = rand() % 100;
}
printf("生成序列\n");
print(p);
}
//交换两个数
void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
//打印数组
void print(int *p){
if(NULL == p)
return;
for(int i = 0; i < SIZE; i++){
printf("%d ", p[i]);
}
printf("\n");
}
//冒泡排序
void bubble(int p[]){
if(NULL == p)
return;
for(int i = 0; i < SIZE - 1; i++){
for(int j = i + 1; j < SIZE; j++){
if(p[i] > p[j])
swap(p[i], p[j]);
}
}
}
//插入排序
void insert_sort(int a[]){
if(NULL == a)
return;
int i, j;
for(i = 0; i < SIZE; i++){
int temp = a[i];
j = i - 1;
while(j >= 0 && a[j] > temp){ //从右向左找a[j]插入
a[j + 1] = a[j]; //后移
j--;
}
a[j + 1] = temp;
}
}
//选择排序
void select_sort(int a[]){
if(NULL == a)
return;
int i, j;
for(i = 0; i < SIZE; i++){
int temp = i;
for(j = i; j < SIZE; j++){
if(a[j] < a[temp])
temp = j;
}
swap(a[i], a[temp]);
}
}
//shell排序
void shell(int *p){
if(NULL == p)
return;
int n = SIZE;
while(n){
for(int i = 0; i + n < SIZE; i++){
int j = i;
while(j + n < SIZE){
if(p[j] > p[j + n])
swap(p[j], p[j + n]);
j = j + n;
}
}
n = n / 2;
}
}
//快速排序
void quick_sort(int *p, int left, int right){
if(NULL == p)
return;
if(left >= right)
return;
int temp = p[left]; //把最左边的元素作为分界数据
int i = left; //从左到右的指针
int j = right + 1; //从右到左的指针
while(1){
//在左侧寻找<pivot的元素
do{
i++;
}while(i <= right && p[i] < temp);
//在右侧寻找<pivot的元素
do{
j--;
}while(j >= left && p[j] > temp);
if(i >= j)
break;
swap(p[i], p[j]);
}
p[left] = p[j];
p[j] = temp;
quick_sort(p, left, j - 1);
quick_sort(p, j + 1, right);
}
int main(){
int a[SIZE];
int choose = 4;
while(1){
init(a);
puts("输入排序方式: 0冒泡排序 1插入排序 2选择排序 3shell排序 4快速排序");
scanf("%d", &choose);
switch(choose){
case 0:
bubble(a);
break;
case 1:
insert_sort(a);
break;
case 2:
select_sort(a);
break;
case 3:
shell(a);
break;
case 4:
quick_sort(a, 0, SIZE - 1);
break;
default:
puts("输入错误");
}
print(a);
puts("\n");
}
return 0;
}