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

查找與排序03,選擇排序,查找排序03選擇

編輯:C#入門知識

查找與排序03,選擇排序,查找排序03選擇


選擇排序是一種低效的排序算法,大致過程是:遍歷數組的每一個元素,先假設0號位置上的元素是最小的,並把0號索引賦值給一個表示最小元素索引的變量,比如說是smallest,再遍歷0號位置以後的元素,一旦發現有比0號位置元素更小的元素,就把該元素的索引賦值給smallest,繼續遍歷,最終把0號位置以後最小元素的索引賦值給了smallest變量,再把0號位置和smallest位置上的元素互換,這樣,在0號位置上放上了最小元素。接著,在1號位置放上倒數第二小的元素,在2號位置放上倒數第三小的元素......以此類推,最終得到一個升序排列的數組。由於是依次循環遍歷數組元素,個人更願意把選擇排序理解成線性排序。

 

自定義一個類,裡面維護著一個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 < size; i++)
            {
                arr[i] = r.Next(1, 100);
            }
        }
        //選擇排序算法
        public void Sort()
        {
            int smallest; //最小元素的索引 
            //最後一個索引位置不需要遍歷,因為在代碼段的內部循環中包含了對最後一個索引位置的處理
            for (int i = 0; i < arr.Length - 1; i++)
            {
                //把當前遍歷的元素的索引賦值給smallest,即假設當前遍歷的數組元素為最小元素
                smallest = i;
                //遍歷當前遍歷元素後面的所有元素
                //獲取最小元素的索引
                for (int index = i + 1; index < arr.Length; index++)
                {
                    if (arr[index] < arr[smallest])
                    {
                        smallest = index;
                    }
                }
                //把當前遍歷元素和最小元素交換位置
                Swap(i, smallest);
                //每次排完序打印
                Print();
            }
        }
        //交換2個位置上的元素
        public void Swap(int first, int second)
        {
            int temp = arr[first];
            arr[first] = arr[second];
            arr[second] = temp;
        }
        //打印數組元素
        public void Print()
        {
            foreach (var item in arr)
            {
                Console.Write(item + " ");               
            }
            Console.WriteLine("\n");
        }
    }

 

客戶端調用。

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

 

可見,對選擇排序來說,外部循環進行了n-1次迭代,內部循環第一次進行了n-1迭代,第二次進行了n-2次迭代……以時間復雜度來說,忽略小項和常數項,選擇排序基本上是一個平方階,寫成O(n²)。

 

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

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

查找與排序02,折半查找

查找與排序03,選擇排序

查找與排序04,插入排序


VB順序查找與選擇排序的代碼·

用循環
好歹你也多寫點信息啊,別人也好幫你
最簡單,查找和排序都有了
form,一個按鈕,開始

Private Sub Command1_Click()
Dim i, j, t, a(1 To 10)
Randomize
Print "原數組:"
For i = 1 To 10
a(i) = Rnd * 10
Print "a(" & i & ") =" & a(i) & Space(2),
If i Mod 2 = 0 Then Print
Next i
Print
For i = 1 To 9
For j = i + 1 To 10
If a(j) < a(i) Then
t = a(i)
a(i) = a(j)
a(j) = t
End If
Next j
Next i
Print "從小到大排序後數組:"
For i = 1 To 10
Print "a(" & i & ") =" & a(i) & Space(2),
If i Mod 2 = 0 Then Print
Next i
End Sub
 

數據查找與排序

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

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

希爾排序代碼

*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;

}
 

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