#include <iostream>
using namespace std;
int arr[] = {2,3,1,5,4,6,8,7,9,10};
void print(int *arr,int len){
for(int i=0;i<len;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
//冒泡-升序排列
void bubble_sort_asc(int* arr,int len){
for(int i=1;i<len;i++){
for(int j=0;j<len-i;j++){
if(arr[j] > arr[j+1]){
swap(arr[j],arr[j+1]);
}
}
}
}
//冒泡-降序排列
void bubble_sort_desc(int*arr,int len){
for(int i=0;i<len;i++){
for(int j=0;j<len-i-1;j++){
if(arr[j] < arr[j+1]){
swap(arr[j],arr[j+1]);
}
}
}
}
//选择排序-升序
void select_sort_asc(int *arr,int len){
for(int i=0;i<len;i++){
int min = i;
for(int j=i+1;j<len;j++){
if(arr[min] > arr[j]){
min = j;
}
}
if(min != i)
swap(arr[i],arr[min]);
}
}
//选择排序-降序
void select_sort_desc(int *arr,int len){
for(int i=0;i<len;i++){
int max = i;
for(int j=i+1;j<len;j++){
if(arr[max] < arr[j]){
max = j;
}
}
if(max != i)
swap(arr[i],arr[max]);
}
}
//插入排序-升序
void insert_sort_asc(int *arr,int len){
int record,index;
for(int i=1;i<len;i++){
index = i-1;
record = arr[i];
while(record < arr[index] && index>=0){
arr[index+1] = arr[index];
index--;
}
//加1回退到争正确位置
arr[index+1] = record;
}
}
//插入排序-降序
void insert_sort_desc(int *arr,int len){
int record,index;
for(int i=1;i<len;i++){
index = i-1;
record = arr[i];
while(record > arr[index] && index>=0){
arr[index+1] = arr[index];
index--;
}
arr[index+1] = record;
}
}
//希尔排序-降序
void shell_sort_desc(int* arr,int len){
int record,index;
for(int i = len/2;i>=1;i /= 2){
for(int j=i;j<len;j++){
record = arr[j];
index = j-i;
while(index >=0 && record > arr[index]){
arr[index+i] = arr[index];
index -= i;
}
arr[index+i] = record;
}
}
}
//希尔排序-升序
void shell_sort_asc(int* arr,int len){
int record,index;
for(int i = len/2; i >= 1;i /= 2){
for(int j=i;j<len;j++){
record = arr[j];
index = j-i;
while(index >=0 && record < arr[index]){
arr[index+i] = arr[index];
index -= i;
}
arr[index+i] = record;
}
}
}
//快速排序-升序
//partition
int partition(int* arr,int low,int high){
int pivotkey = arr[low];
while(low < high){
while(low<high && arr[high] >= pivotkey){ //降序 while(low<high && arr[high] <= pivotkey)
high--;
}
swap(arr[low],arr[high]);
while(low<high && arr[low] <= pivotkey){ //降序 while(low<high && arr[high] >= pivotkey)
low++;
}
swap(arr[low],arr[high]);
}
return low;
}
//quick-sort
void quick_sort_asc(int *arr,int low,int high){
int pivot;
if(low < high){
pivot = partition(arr,low,high);
quick_sort_asc(arr,low,pivot-1);
quick_sort_asc(arr,pivot+1,high);
}
}
//堆排序
void heap_sort(int* arr,int n){
int i,j,h,k;
int t;
//将a[0,n-1]建成大根堆
for(i=n/2-1;i>=0;i--){
cout<<"for() i:"<<i<<endl;
while(2*i+1<n){
cout<<"while() i:"<<i<<endl;
j = 2*i+1;
if((j+1)<n){
if(arr[j] <arr[j+1]){ //左子树 小于右子树,则需要比较右子树
j++; //序号增加1,指向右子树
}
}
if(arr[i] < arr[j]){ //比较i与j为序号的数据
t = arr[i]; //交换数据
arr[i] = arr[j];
arr[j] = t;
i=j;
}else{ //比较左右子结点均大则堆为破坏,不在需要调整
break;
}
}
}
//输出数据构成的堆
cout<<"输出数据构成的堆:"<<endl;
for(h=0;h<n;h++){
cout<<"arr["<<h<<"]:"<<arr[h]<<'\t';
}
cout<<endl;
for(i=n-1;i>0;i--){
t = arr[0]; //与第i个记录交换
arr[0] = arr[i];
arr[i] = t;
k = 0;
while(2*k+1 < i){
j = 2*k+1;
if((j+1)<i){
if(arr[j] < arr[j+1]){
j++;
}
}
if(arr[k] < arr[j]){ //比较i与j为序号的数据
t = arr[k];
arr[k] = arr[j];
arr[j] = t;
k = j;
}else{
break;
}
}
cout<<"第"<<n-i<<"步排序结果 ";
for(h=0;h<n;h++){
cout<<"arr["<<h<<"]:"<<arr[h]<<'\t';
}
cout<<endl;
}
}
//归并排序
/**
@params
a 保存带排序的数组
b 保存合并后的数组
n 表示数组a中需要进行排序的元素总数
len 表示每个字长度的长度
*/
void merge_one(int* a,int* b,int n,int len){
int i,j,k,s,e;
s = 0;
while(s+len < n){
e = s + 2*len -1;
if(e >= n){
//最后一段可能少于len个结点
e = n - 1;
}
//相邻有序段的合并
k = s;
i = s;
j = s + len;
while(i < s+ len && j <= e){ //如果两个有序表都未结束时,循环比较
if(a[i] <= a[j]){
b[k++] = a[i++];//较小的元素复制到数组b中
}else{
b[k++] = a[j++];
}
}
while(i < s+len){ //未合并的部分复制到数组b中
b[k++] = a[i++];
}
while(j<=e){
b[k++] = a[j++];//未合并的部分复制到数组b中
}
s = e+1; //下一对有序段中左段的开始下标
}
if(s<n){ //将剩余部分的下一个有序段 从数组A中复制到数组B中
for(;s<n;s++){
b[s] = a[s];
}
}
}
void merge_sort(int* arr,int n) {
int h,count,len,f;
count =0; //排序步骤
len = 1; //有序序列的长度
f = 0; //变量f坐标志
int* p= new int[n];
while(len < n){
if(f == 1){ //交替在A和P之间合并
merge_one(p,arr,n,len); //p合并到a
}else{
merge_one(arr,p,n,len); //a合并到p
}
len = len*2; //增加有序序列长度
f = 1-f; //使f在0 和 1 之间切换
count ++;
cout<<"第"<<count<<"步排序结果." ;
for(h=0;h<n;h++){
cout<<arr[h]<<'\t';
}
cout<<endl;
}
if(f == 1){ //如果进行了排序,
for(h=0;h<n;h++){ //将内存p中的数据复制回a数组
arr[h] = p[h];
}
}
delete[] p;
}
int main(int argc, char** argv) {
merge_sort(arr,10);
print(arr,10);
return 0;
}
常见排序算法总结-C++实现
最新推荐文章于 2024-01-09 10:14:41 发布