不稳定的排序:快(快排)些(希尔)选(选择)一堆(堆排)
下面是冒泡、选择、插入、希尔、归并、快速排序和测试用例的创建的代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
//测试框架
int* createRandArray(int n){
int* arr = (int*)malloc(n*sizeof(int));
srand(time(NULL));
for(int i=0;i<n;++i){
arr[i] = rand()%100+1;
}
return arr;
}
// 打印数组
void printArray(int* arr,int n){
for(int i=0;i<n;++i){
printf("%d ",arr[i]);
}
printf("\n");
}
// 判度数组是否是非递减排序
bool isOrder(int* arr,int n){
for(int i=1;i<n;++i){
if(arr[i]>=arr[i-1]){
continue;
}else{
return false;
}
}
return true;
}
//===========================================冒泡排序=======================================================
void bubble_sort(int* arr,int n){
if(n<1) return;
for(int i = 0;i <n;i++){//每冒泡一次,下次需要冒泡排序的数组长度减1
for(int j = 0;j<n-i-1;j++){//交换的是倒数第二个和倒数第二个+1个(倒数第一个)
if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]);
}
}
}
//===========================================选择排序=======================================================
//找出最大的元素,放在最后一位
int find_max_element_index(int* arr,int n){
int max_index = 0;
int max_element = 0;
for(int i = 0;i<n;i++){
if(arr[i]>max_element) {
max_element = arr[i];
max_index = i;
}
}
return max_index;
}
void select_sort(int* arr,int n){
if(n<1) return;
int max_element_index = 0;
for(int i = n;i>1;i--){
max_element_index = find_max_element_index(arr,i);
swap(arr[max_element_index],arr[i-1]);//注意,是第i-1个而不是第i个
}
}
//===========================================插入排序=======================================================
//不停地拿元素去插入已经排序好的数组
/*
void insert(int* arr,int n){
for(int i = n-1;i>0;i--){
if(arr[i]<arr[i-1]){
swap(arr[i],arr[i-1]);
}
}
}
void insert_sort(int* arr,int n){
for(int i = 2; i <=n;i++){
insert(arr,i);
}
}
*/
void insert_sort(int* arr,int n){
for(int i = 2; i <=n;i++){
for(int j = i-1;j>0;j--){
if(arr[j]<arr[j-1]){
swap(arr[j],arr[j-1]);
}
}
}
}
//===========================================归并排序=======================================================
void merge_arr(int* arr,int mid,int n){
int tmp[n];
int p = 0;// 前半部分下标
int q = mid;// 后半部分下标
int k = 0;// 结果下标
while(p<mid&&q<n){
if(arr[p]<arr[q]){
tmp[k++]=arr[p++];
}else{
tmp[k++] =arr[q++];
}
}
while(p<mid) tmp[k++]=arr[p++];
while(q<n) tmp[k++] =arr[q++];
for(int i = 0;i<n;i++){
arr[i]=tmp[i];
}
}
void merge_sort(int* arr,int n){
if(n<2) return;
int mid = n/2;
merge_sort(arr,mid);
merge_sort(arr+mid,n-mid);
merge_arr(arr,mid,n);
}
//===========================================快速排序=======================================================
int position(int* arr,int n){
int posit = arr[0];
int i = 0;
int j = n-1;
while(i<j){
while(i<j && arr[j]>=posit) --j;
while(i<j && arr[i]<=posit) ++i;
if(i<j) swap(arr[i],arr[j]);
}
swap(arr[i],arr[0]);
return i;
}
void quick_sort(int* arr,int n){
if(n<2) return;
int pos = position(arr,n);
quick_sort(arr,pos);
quick_sort(arr+pos+1,n-pos-1);
}
//===========================================希尔排序=======================================================
void shell_sort(int arr[],int n){
int gap = n;
do{
gap = gap/2;
for(int i=gap;i<=n;++i){ //插入排序的初始数据数到结束
for(int j=i-1;j>=0;j-=gap){ //插入排序
if(arr[j]<arr[j-gap]){
swap(*(arr+j),*(arr+j-gap));
}else{
break;
}
}
}
}while(gap>1);
}
//=========================================================================================================
int main(){
int n;
cin >> n;
int * arr = createRandArray(n);
printArray(arr,n);
//bubble_sort(arr,n);
//select_sort(arr,n);
//insert_sort(arr,n);
//merge_sort(arr,n);
shell_sort(arr,n);
//sort(arr,arr+n);//STL
//quick_sort(arr,n);
printArray(arr,n);
cout << isOrder(arr,n) << endl;
}