程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 查找與排序04,插入排序,查找排序04插入

查找與排序04,插入排序,查找排序04插入

編輯:C#入門知識

查找與排序04,插入排序,查找排序04插入


在選擇排序中,從第一個元素開始,依次遍歷數組中的元素,找出當前遍歷元素之後的最小元素,與當前遍歷元素交換位置,依此類推,是一種由前往後的排序。而在插入排序中,從第二個元素開始,依次遍歷數組中的元素,把當前遍歷元素與之前的元素進行比較,並插入到之前的某個位置,是一種由後往前的排序。

 

自定義一個類,裡面維護著一個int[]類型數組,通過構造函數定義數組長度並初始化,並提供了打印和插入排序的相關方法。

    public class MyArray
    {
        private static int[] arr;
        private static Random r = new Random();
        public MyArray(int size)
        {
            arr = new int[size];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = r.Next(10, 100);
            }
        }
        //插入排序
        public void Sort()
        {
            int insert;
            for (int i = 1; i < arr.Length; i++) //從第二個元素開始遍歷
            {
                insert = arr[i];//把當前遍歷元素視為插入元素,放到臨時變量insert中
                int moveItem = i;//movieItem可以理解為一個動態索引,初始位置在當前遍歷元素的索引
                while (moveItem > 0 && arr[moveItem -1] > insert) //如果前面一個元素比插入元素大
                {
                    arr[moveItem] = arr[moveItem - 1];//那就把前面這個元素賦值給後面位置,相當於往後移一位
                    moveItem--;//再把動態索引位置向前移動一位
                }
                arr[moveItem] = insert;
                Print();
            }
        }
        //打印數組元素
        public void Print()
        {
            foreach (var item in arr)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }
    }
以上,大致過程是:從數組中第二個元素開始,先把當前遍歷元素賦值給一個臨時變量,比如說是insert,insert這個變量肯定要插入到當前遍歷元素之前的某個位置,如何確定插入位置呢?假設用moveItem變量表示最終要插入的索引位置,先把當前遍歷元素的索引賦值給moveItem,如果moveItem-1位置上的元素大於insert,那就把moveItem-1位置上的元素向後移動一位,並把moveItem-1位置的索引賦值給moveItem,insert是要插入到當前的這個moveItem位置嗎?不一定。再繼續拿當前moveItem位置的前面一個位置上的元素與insert比較,只要是比insert大,就把該位置上的元素向後移動一位,並重新設置moveItem的值,直到停止循環。此時moveItem的值就是insert需要插入的位置。

 

客戶端調用。

    class Program
    {
        static void Main(string[] args)
        {
            MyArray myArray = new MyArray(8);
            Console.WriteLine("排序前:");
            myArray.Print();
            Console.WriteLine("排序後:");
            myArray.Sort();
            Console.ReadKey();
        }
    }

 

對於插入排序,當依次遍歷數組元素時,進行了n-1次迭代,當把第二個元素插入到之前某個位置時進行了1次迭代,當把第三個元素插入到之前某個位置時進行了2次迭代......第n個元素進行了n-1次迭代,以時間復雜度來說,忽略小項和常數項,插入排序基本上是一個平方階,寫成O(n²)。 

 

“查找與排序”系列包括:

查找與排序01,線性查找,時間復雜度,算法

查找與排序02,折半查找

查找與排序03,選擇排序

查找與排序04,插入排序


數據查找與排序

順序查找
折半查找
分塊查找
直接查找

插入排序
希爾排序
選擇排序
快速排序

希爾排序代碼

*p=數組指針; n=數組元素個數
void Hill_arrangement(int *p,int n)
{int i,gap,j,temp;
gap=n/2;
while(gap>=1)
{for(i=gap;i<n;i++)
{temp=*(p+i);
j=i;
while(j>=gap&&*(p+j-gap)>temp)
{*(p+j)=*(p+j-gap);
j=j-gap;
*(p+j)=temp;
}
}
gap=gap/2;
}
}

有序表折半搜索代碼(返回下標)

int binarysearch(int *p,int n,int k)
{int low=0,up=n-1,mid;
while(low<=up)
{mid=(low+up)/2;
if(k==*(p+mid))return mid;
else if(k<*(p+mid))up=mid-1;
else low=mid+1;
}
return -1;

}
 

幾個C語言的程序 順序查找,排序(升序與降序),冒泡排序,選擇排序,直接插入排序與二分插入排序

首先聲明下面的程序不全是我寫的,還有就是你說的二分插入排序 不知道是什麼,我想應該是二分法查找已經排序的數組吧!!!
希望你能滿意。

1.順序查找

#include<stdio.h>
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,x,y;
printf("輸入你要查找的數:\n");
scanf("%d",&x);
y=0; //標記是否已找到,y=1表是找到了,y=0表示沒找到
for(i=0;i<10;i++) //循環,把x和數組中的元素一個個比較
{
if(x==a[i]) //如果x=a[i]說明已經找到
{
y=1; //把y變成1,說明已經找到了
printf("你要查找的數%d在第個%d位置\n",x,i+1); //輸出找到的相關信息
break; //跳出循環
}
}
if(y==0)printf("無法找到你要查找的數\n"); //y=0表示找不到
}

2.排序(升序和降序)

#include<stdio.h>
void main()
{
int a[5]={};
int i,j;
int temp=0;
for(i=0;i<5;i++)
{
printf("請輸入第%d個整數\n",i+1);
scanf("%d",&a[i]);
}
for(i=1;i<5;i++)
{
for(j=0;j<5-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(i=0;i<5;i++)
{
printf("排序後的整數:%d\t",a[i]);
}
}
現在是升序的。。如果想改成降序 只要交換一下大小的順序就好了

3.冒泡排序
#include<stdio.h>
main()
{
int i,j,temp;
int a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
for(j=0;j<=9;j++)
{ for (i=0;i<10-j;i++)
if (a[i]>a[i+1])
{ temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=1;i<11;i++)
printf("%5d,",a[i] );
printf("\n");
}

4.選擇排序
#include<stdio.h>
void selectSort(int a[],int n)
{int t,i,j,k;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
k=j;
t=a[i];
a[i]=a[k];
a[k]=t;
}
}

......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved