大家好,我是一只学弱狗,记录学习的点点滴滴!
优质文章
优质专栏
#include <iostream>
#include <conio.h>
using namespace std;
//冒泡排序
void Bubble_Sort(int *data,int n);
//选择排序
void Select_Sort(int *data,int n);
//插入排序(顺序查找)
void Insert_Sort(int *data,int n);
//插入排序(二分查找)
void Insert_Sort_Binary_Search(int *data,int n);
//快速排序
void Quick_Sort(int *data,int n);
//归并排序
void Merge_Sort(int *data,int n);
int main(){
freopen("排序算法回顾.txt","r",stdin);
int n;
cin>>n;
int *data = new int[n];
for(int i=0;i<n;i++) cin>>data[i];
//Bubble_Sort(data,n);
//Select_Sort(data,n);
//Insert_Sort(data,n);
//Insert_Sort_Binary_Search(data,n);
Quick_Sort(data,n);
//Merge_Sort(data,n);
for(int i=0;i<n;i++) cout<<data[i]<<" ";
delete[] data;
data = NULL;
return 0;
}
//冒泡排序 仅相邻的两个元素做比较,若不符合顺序,则交换
void Bubble_Sort(int *data,int n)
{
int Pos = -1;
bool change = false;//该趟是否有值改变
for(int i=n-1;i>=1;i--){
//趟数 最多需要n-1趟
for(int j=0;j<i;j++){
if(data[j] > data[j+1] ){
swap(data[j],data[j+1]);
change = true;
Pos = j+1;
}
}
if(!change) break;
if(Pos!=-1){
i=Pos;
Pos = -1;
}
change = false;
}
}
//选择排序
void Select_Sort(int *data,int n){
for(int i=0;i<n-1;i++){
int index=i;
for(int j=i+1;j<n;j++){
if(data[j]<data[index]){
index=j;
}
}
swap(data[i],data[index]);
}
}
//移动从start到start+length的数组内容
void move(int *data,int start,int length){
for(int i=start+length;i>start;i--){
data[i] = data[i-1];
}
}
//插入排序(顺序查找)
void Insert_Sort(int *data,int n){
for(int i=1;i<n;i++){
int tmp = data[i];
int j=i-1;
while(j>=0 && tmp<data[j]){
j--;
}
move(data,j+1,i-j-1);
data[j+1] = tmp;
}
}
//插入排序(二分查找)
void Insert_Sort_Binary_Search(int *data,int n){
for(int i=1;i<n;i++){
int tmp = data[i];
int left = 0;
int right = i-1;
while(left<=right){
int mid = (left+right)/2;
if(tmp<data[mid]){
right = mid-1;
}else if(tmp>=data[mid]){
left = mid+1;
}
}
move(data,left,i-left);
data[left] = tmp;
}
}
void Quick_Sort_Recursion(int *data,int start,int end){
if(start>=end) return ;
int p = data[start];
int left = start;
int right = end;
while(left!=right)
{
while(right>left && data[right]>=p) right--;
while(right>left && data[left]<=p) left++;
if(data[left]>data[right]){
swap(data[left],data[right]);
}
}
if(data[start] > data[left]){
swap(data[start],data[left]);
}
Quick_Sort_Recursion(data,start,left-1);
Quick_Sort_Recursion(data,left+1,end);
}
//快速排序
void Quick_Sort(int *data,int n){
Quick_Sort_Recursion(data,0,n-1);
}
void Merge_Sort_Recursion(int *data,int *recode,int start,int end){
if(start==end) return ;
int mid = (start+end)/2;
Merge_Sort_Recursion(data,recode,start,mid);
Merge_Sort_Recursion(data,recode,mid+1,end);
int left = start;
int right = mid+1;
int pos = start;
while(left<=mid &&right<=end){
if(data[left]<data[right]){
recode[pos++] = data[left++];
}else{
recode[pos++] = data[right++];
}
}
while(left<=mid){
recode[pos++] = data[left++];
}
while(right<=end){
recode[pos++]= data[right++];
}
for(int i=start;i<=end;i++){
data[i] = recode[i];
}
}
//归并排序
void Merge_Sort(int *data,int n){
int * recode = new int[n];
Merge_Sort_Recursion(data,recode,0,n-1);
}