ソートアルゴリズム(C実装)について
5152 ワード
2019.9.21-2019.9.23 8個の並べ替えアルゴリズムをレビューして再学習し、理解した後に自分で一度実現し、すべてテストに合格した(手動でQQQQをテストする)
泡の順序付け:隣接する2つの比較、大きい数の後沈
≪ソートの選択|Select Sort|oem_src≫:最小の要素を選択して最前面に配置し、「≪現在の最小の要素|Current Minimum Elements|oem_src≫」を比較するたびに、前にソートされたシーケンスの最後に配置します.
≪ソートの挿入|Insert Sort|Planning≫:2番目の要素から、前の要素と比較し続けます.この要素が小さい場合は、「≪現在の先頭|Current Top|Planning≫」に挿入されます.
ヒルソート:間隔を予め設定し、各間隔内で挿入ソートを使用します.
クイックソート:ダブルポインタ.flagは三者で取り、最もrightの場所に置く.左右のポインタが指す要素をflagと比較してleft++,right--または交換する
ヒープの順序付け:ヒープを構築し、最大はヒープの上にあり、その後、最後の要素をヒープの上に置くたびに、現在の最大をヒープの上に置き換えます.
集計ソート:思想を分割し、各要素が1つになるまでブロックを分割し、次に1つずつ比較します.
基数の順序付け:まず数位、更に10位、ある1位の同じ大きさのを同じ“桶”の中に置いて、それからそれぞれの桶は比較して、先に数位、更に10位、毎回比較した後に相対的な位置を更新して、このように押します
PS.配列要素の交換については、値ではなくアドレスを送信します.swap関数を定義するときは、int swap(int&a,int&b)で、その内部およびメイン関数での呼び出しは通常の形式と同じです.もちろん、私が次のコードで実装したように、swap(int*a、int*b)でもいいですが、この場合、swap内部や主関数呼び出し時の表現が少し異なり、少し面倒です.
泡の順序付け:隣接する2つの比較、大きい数の後沈
≪ソートの選択|Select Sort|oem_src≫:最小の要素を選択して最前面に配置し、「≪現在の最小の要素|Current Minimum Elements|oem_src≫」を比較するたびに、前にソートされたシーケンスの最後に配置します.
≪ソートの挿入|Insert Sort|Planning≫:2番目の要素から、前の要素と比較し続けます.この要素が小さい場合は、「≪現在の先頭|Current Top|Planning≫」に挿入されます.
ヒルソート:間隔を予め設定し、各間隔内で挿入ソートを使用します.
クイックソート:ダブルポインタ.flagは三者で取り、最もrightの場所に置く.左右のポインタが指す要素をflagと比較してleft++,right--または交換する
ヒープの順序付け:ヒープを構築し、最大はヒープの上にあり、その後、最後の要素をヒープの上に置くたびに、現在の最大をヒープの上に置き換えます.
集計ソート:思想を分割し、各要素が1つになるまでブロックを分割し、次に1つずつ比較します.
基数の順序付け:まず数位、更に10位、ある1位の同じ大きさのを同じ“桶”の中に置いて、それからそれぞれの桶は比較して、先に数位、更に10位、毎回比較した後に相対的な位置を更新して、このように押します
PS.配列要素の交換については、値ではなくアドレスを送信します.swap関数を定義するときは、int swap(int&a,int&b)で、その内部およびメイン関数での呼び出しは通常の形式と同じです.もちろん、私が次のコードで実装したように、swap(int*a、int*b)でもいいですが、この場合、swap内部や主関数呼び出し時の表現が少し異なり、少し面倒です.
#include
#include
#include
#include
#include
int n;// , ....
void swap(int*a,int*b){// , !!!
int c=*a;
*a=*b;
*b=c;
}
int jishu_getNumLength(int maxvalue){
int i=0;
while(maxvalue>0){
maxvalue=maxvalue/10;
i++;
}
return i;
}
int jishu_getMaxValue(int a[]){
int temp=0;
for(int i=0;ia[j]){
b[k]=a[j];
j++;
k++;
}
}
while(i<=mid){
b[k]=a[i];
k++;
i++;
}
while(j<=right){
b[k]=a[j];
k++;
j++;
}
}
void merge_sort(int a[],int b[],int left,int right){
if(right>left){
int mid=left+(right-left)/2;
merge_sort(a,b,left,mid);
merge_sort(a,b,mid+1,right);
merge(a,b,left,mid,right);
for(int i=left;i<=right;i++){
a[i]=b[i];
}
}
}
void heapadjust(int a[],int index,int length){
int leftchild=index*2+1;
int rightchild=index*2+2;
int cur=index;
if(a[leftchild]>a[cur]&&leftchilda[cur]&&rightchild=0;i--){
heapadjust(a,i,length);
}
}
void heapsort(int a[],int length){
int len=length;
buildheap(a,len);
for(int i=len-1;i>0;i--){//i
swap(&a[0],&a[i]);
len--;
heapadjust(a,0,len);
}
}
int quick_findmidkey(int a[],int left,int right){
int mid=left+(right-left)/2;
if((mid<=left&&mid>=right)||(mid>=left&&mid<=right)){
return mid;
}
else if((mid>=left&&left>=right)||(mid<=left&&left<=right)){
return left;
}
else if((mid>=right&&right>=left)||(mid<=right&&right<=left)){
return right;
}
return 0;
}
int quick_part(int a[],int left,int right){//
if(left=key&&lefta[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=false;
}
}
if(flag==true){
break;
}
}
}
void select(int a[]){//
for(int i=0;ia[j]){
min=j;
}
}
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
void insertsort(int a[]){// , ,
for(int i=1;i0){
a[j]=a[j-1];
j--;
}
if(j!=i){
a[j]=temp;
}
}
}
void xier(int a[]){
int gap=1;
while(gap0){
for(int i=gap;i=0){
a[j+gap]=a[j];
j=j-gap;
}
a[j+gap]=temp;
}
gap=gap/3;
}
}
int main()
{
int beforesort[10000];
int result[100000];
scanf("%d",&n);
int i=0;
while(i