ソートアルゴリズムの簡単なソート方法
ソートの概念:レコードのグループを降順または昇順で再配置する操作です。(単純選択ソート、直接挿入ソート、バブルソート)など、多くのソート方法があります。もちろん、また、(マージソート、クイックソート、ヒープソート、基数ソート)などの高度なソート方法もあります。今日は、主に単純なソートについて説明します。含む(直接挿入ソート、半分挿入ソート、ヒルソート)
直接挿入ソート
- 挿入ソートの基本的な考え方:ソートされたサブセットに基づいて、各ステップは、ソートされるすべてが挿入されるまで、ソートされる次のレコードをソートされた順序で順番に挿入します。
- アルゴリズムの実装、c言語コード。
void InsertSort(int a[],int n){
int i,j,temp;
for(i=2;i<n;i++) //将各元素插入到已排好序列
if(a[i]<a[i-1]){
//a[i]小于前驱
temp=a[i]; //temp暂存a[i]
for(j=i-1;j>=0&&a[j]>temp;j--){
//检查前面已经排好的
a[j+1]=a[j]; //大于temp的元素向后面挪
}
a[j+1]=temp; //复制到插入位置
}
return;
}
void Printarr(int a[],int n) //输出数组
{
int i;
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return;
}
int main(){
//主函数
int a[]={
1,8,7,5,6};
int n=5;
printf("未排序的数\n");
Printarr(a,n);
printf("\n");
InsertSort(a,n);
printf("排好序的数\n");
Printarr(a,n);
return 0;
}
3.実験結果
スペースの複雑さO(1)
最良の時間計算量の結果はO(n)であり、最悪の結果はO(n2)です。
分割挿入ソート
1.半分の挿入のアイデア:直接挿入に基づいて、半分の検索のアイデアを通じて、挿入する位置をすばやく見つけて、挿入の速度を最適化します。
2.アルゴリズムの実装、c言語コード
#include <stdio.h>
void BinSort(int a[],int n){
int i,j,low,high,mid;
int temp=0;
for(i=1;i<n;++i) {
//将各元素插入到已排好序列
low=0,high=i-1;
temp=a[i]; //当前插入元素个temp保存
while(low<=high){
//进行折半查找
mid=(low+high)/2;
if(a[mid]>temp) high=mid-1;
else low=mid+1;
}
//移动元素
for(j=i-1;j>=high+1;--j){
a[j+1]=a[j];
}
a[high+1]=temp;
}
}
void Printarr(int a[],int n) //输出数组
{
int i;
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return;
}
int main(){
//主函数
int a[]={
1,8,7,5,6};
int n=5;
printf("未排序的数\n");
Printarr(a,n);
printf("\n");
BinSort(a,n);
printf("排好序的数\n");
Printarr(a,n);
return 0;
}
3.実験結果
スペースの複雑さO(1)
最良の時間計算量の結果はO(n)であり、最悪の結果はO(n2)です。
ヒルソート
1.ヒルソートは「インクリメンタルソートの削減」とも呼ばれます
基本的な考え方:最初に、並べ替えるレコードのシーケンス全体をいくつかのサブシーケンスに分割し、サブシーケンスごとに個別に直接挿入ソートを実行し、レコード全体に対して「基本的に順番に」直接挿入ソートを実行します。シーケンス全体。
2.アルゴリズムの実装、c言語
#include <stdio.h>
void ShellSort(int a[], int n) //a -- 待排序的数组, n -- 数组的长度
{
int i,j,b; // b为步长,每次减为原来的一半。
for (b = n / 2; b > 0; b /= 2)
{
for (i = 0 ;i < b; i++)
{
for (j = i + b; j < n; j += b)
{
// 如果a[j] < a[j-b],则寻找a[j]位置,并将后面数据的位置都后移。
if (a[j] < a[j - b])
{
int tmp = a[j];
int k = j - b;
while (k >= 0 && a[k] > tmp)
{
a[k + b] = a[k];
k -= b;
}
a[k + b] = tmp;
}
}
}
}
}
void Printarr(int a[],int n) //输出数组
{
int i;
for(i=0;i<n;i++){
printf("%d",a[i]);
}
return;
}
int main(){
//主函数
int a[]={
1,8,7,5,6,};
int n=5;
printf("未排序的数\n");
Printarr(a,n);
printf("\n");
ShellSort(a,n);
printf("排好序的数\n");
Printarr(a,n);
return 0;
}
3.実験結果
スペースの複雑さO(1)