淺談2路拔出排序算法及其簡略完成。本站提示廣大學習愛好者:(淺談2路拔出排序算法及其簡略完成)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談2路拔出排序算法及其簡略完成正文
2路拔出排序算法是在直接拔出排序算法的基本上增長了一個幫助數組,其目標是削減排序進程中的挪動次數,須要增長n個記載的幫助空間。
難點能夠在於對取余的斟酌吧,可以把幫助數組算作一個環狀空間,如許就可以更好的懂得幫助空間中最年夜值和最小值的地位了。
算法全體思惟照樣很簡略的,直接貼出可運轉代碼,正文照樣挺清晰的,年夜家直接看就ok了
C說話完成示例
#include <stdio.h>
#include <stdlib.h>
void insert_sort(int *arr, int *temp, int n)
{
int i, first, final, k;
first = final = 0;
temp[0] = arr[0];
for (i = 1; i < n; i ++) {
if (arr[i] < temp[first]) { // 待拔出元素比最小的元素小
first = (first - 1 + n) % n;
temp[first] = arr[i];
} else if (arr[i] > temp[final]) { // 待拔出元素比最年夜元素年夜
final = (final + 1 + n) % n;
temp[final] = arr[i];
} else { // 拔出元素比最小年夜,比最年夜小
k = (final + 1 + n) % n;
while (temp[((k - 1) + n) % n] > arr[i]) {
temp[(k + n) % n] =temp[(k - 1 + n) % n];
k = (k - 1 + n) % n;
}
temp[(k + n) % n] = arr[i];
final = (fianl + 1 + n) % n;
}
}
// 將排序記載復制到本來的次序內外
for (k = 0; k < n; k ++) {
arr[k] = temp[(first + k) % n];
}
}
int main(void)
{
int i, n, *arr, *temp;
while (scanf("%d", &n) != EOF) {
arr = (int *)malloc(sizeof(arr) * n);
temp = (int *)malloc(sizeof(temp) * n);
for (i = 0; i < n; i ++)
scanf("%d", &arr[i]);
insert_sort(arr, temp, n);
for (i = 0; i < n; i ++)
printf("%d ", arr[i]);
printf("\n");
free(arr);
free(temp);
}
return 0;
}
同時附上C++寫法:
#include<iostream>
using namespace std;
#define MAX 20
void PrintArray(int a[],int len){
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void BinInsertSort(int a[],int len){
int *d=(int *)malloc(len*sizeof(len));
for(int i=0;i<len;i++)
d[i]=0;
int first=0,final=0;
d[0]=a[0];
for(int i=1;i<len;i++){
if(a[i]<=d[first]){
first=(first-1+len)%len;
d[first]=a[i];
}
else if(a[i]>=d[final]){
final=final+1;
d[final]=a[i];
}
else{
int j=final++;
while(a[i]<d[j]){
d[(j+1)%len]=d[j];
j=(j-1+len)%len;
}
d[j+1]=a[i];
}
}
cout<<"幫助數組中排序成果為:";
PrintArray(d,len);
}
int main(){
int a[MAX],len;
cout<<"請輸出待排序的元素個數:";
cin>>len;
cout<<"請輸出待排序的元素:";
for(int i=0;i<len;i++)
cin>>a[i];
BinInsertSort(a,len);
system("pause");
return 0;
}