<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    算法之簡單排序

    Posted on 2007-02-20 12:54 dennis 閱讀(500) 評論(0)  編輯  收藏 所屬分類: 數據結構與算法
    一。直接插入排序
    1。直接插入排序:直接插入排序是一種簡單的排序方法,它的基本思想是將待排序的記錄按照其值的大小插入到已排好序的有序表的適當位置,直到全部插入完為止。舉個整型的排序例子
    2。直接插入排序的偽代碼:
    insertionsort(data[])
    ???
    for?i=1?to?data.length-1
    ???????tmp
    =data[i];
    ???????將所有大于tmp的元素data[j]向后移動一位;
    ???????將tmp放在正確的位置上;

    3.簡單例子,以整型為例。
    A)ruby語言實現:
    ?
    def?insertion_sort(a)
    ??i
    =1
    ??
    while?i<a.length
    ????tmp
    =a[i]
    ????j
    =i
    ????
    while?j>0
    ??????break?
    if?tmp>a[j-1]
    ??????a[j]
    =a[j-1]
    ??????j
    -=1
    ????end
    ????a[j]
    =tmp
    ????i
    +=1
    ??end
    end???????
    a
    =[10,2,3]
    insertion_sort(a)
    a
    .each{|i?|?print?i.to_s+"?"}

    B)java語言實現:
    package?com.sohu.blog.denns_zane.sort;

    public?class?InsertSort{
    ????
    public?static?void?main(String?args[]){
    ????????
    int?[]data={12,2,3,56,90};
    ????????insertsort(data);
    ????????
    for(int?i=0;i<data.length;i++){
    ????????????System.out.print(data[i]
    +"?");
    ????????}

    ????}

    ????
    public?static?void?insertsort(int?[]data){
    ????????
    for(int?i=1,j;i<data.length;i++){
    ????????????
    int?tmp=data[i];
    ????????????
    for(j=i;j>0&&tmp<data[j-1];j--)
    ???????????????data[j]
    =data[j-1];
    ????????????data[j]
    =tmp;???
    ????????}

    ????}

    }


    5。算法復雜度:
    最好情況:進行n-1次比較和2(n-1)次移動,盡管他們其實都是多余的,復雜度O(n)
    最壞情況:具體計算略,O(n*n)
    平均情況:O(n*n),也就是接近最壞情況,在平均情況下,數組大小翻倍,它的排序工作將是原來的4倍。

    二。選擇排序
    1。算法描述:選擇算法試圖先查找一個放錯位置的元素并將它放到最終位置上,以此來局部化數組元素的交換。選擇值最小的元素并將它和第一個位置上的元素交換。在第i步中,查找data[i],...,data[n-1]中的最小元素,并將它和data[i]進行交換。重復此過程,直到所有的元素都放入正確的位置為止。

    2。偽代碼描述:
    selectionsort(data[])
    ?????
    for?i=0?to?data.length-2
    ????????從data[i],,data[n
    -1]中選取最小的元素
    ????????將它和data[i]交換
    ?
    3。實現,以整型數組為例:
    1)ruby語言實現:

    def?selection_sort(a)
    ??least
    =0
    ??
    for?i?in?(0..(a.length-2))
    ????j
    =i+1
    ????least
    =i
    ????
    while?j<a.length
    ??????
    if?a[j]<a[least]
    ????????least
    =j
    ??????end
    ??????j
    +=1??
    ????end
    ????a[least]
    ,a[i]=a[i],a[least]?unless?least==i?#交換
    ??end
    end
    a
    =[12,4,34,23,45,35]
    selection_sort(a)
    a
    .each{|i|?print?i.to_s+"?"}

    代碼很好理解,不做解釋。

    2)java語言實現:
    package?com.sohu.blog.denns_zane.sort;

    public?class?SelectionSort{
    ????public?static?
    int[]?selection_sort(int?[]?data){
    ????????
    int?i,j,least=0;
    ????????
    for(i=0;i<data.length-1;i++){
    ????????
    ??????????
    for(j=i+1,least=i;j<data.length;j++)
    ????????????
    if?(data[j]<=data[least])
    ????????????????????least
    =j;
    ??????????
    if?(least!=i)
    ????????????swap(data
    ,least,i);??//????data[i]oí×?D??a??
    ????????}????
    ????????
    return?data;???
    ????}
    ????public?static?void?swap(
    int[]data,int?least,int?i){
    ????????
    int?tmp=data[least];
    ????????data[least]
    =data[i];
    ????????data[i]
    =tmp;
    ????}
    ????public?static?void?main(String?args[]){
    ????????
    int[]?t={10,29,12,23,56};
    ????????selection_sort(t);
    ????????
    for(int?i:t){
    ????????????
    System.out.print(i+"?");
    ????????}?
    ????}
    }

    4.算法效率:
    任何情況下,都需要進行n*(n-1)/2次比較,也就是O(n*n)的復雜度
    最好情況:數組已經排序,不需要交換任何元素
    最壞情況:最大元素在第一個位置而其他元素有序時,需要進行3*(n-1)次交換,即O(n),也是很好的結果

    三。冒泡排序
    1。算法偽代碼描述:
    bubblesort(data[])
    ??
    for?i=0?to?data.length-2
    ?????
    for?j=data.length-1?downto?i+1
    ?????????如果順序錯誤,就交換j和j
    -1位置上的元素

    2。實現:
    1)ruby語言實現:
    def?bubble_sort(data)
    ??
    for?i?in?(0..(data.length-2))
    ?????j
    =data.length-1
    ?????
    while?j>i
    ????????
    if?data[j]<data[j-1]
    ???????????data[j]
    ,data[j-1]=data[j-1],data[j]???#交換
    ????????end
    ????????j
    -=1
    ?????end
    ??end
    end
    a
    =[12,3,56,7,89,87]
    bubble_sort(a)
    a
    .each{|i|?print?i.to_s+"?"}

    2)java語言實現:
    package?com.sohu.blog.denns_zane.sort;

    public?class?BubbleSort{
    ????
    public?static?void?bubble_sort(int?[]?data){
    ????????
    for(int?i=0;i<data.length-1;i++)
    ????????????
    for(int?j=data.length-1;j>i;j--)
    ??????????????
    if(data[j]<data[j-1])
    ????????????????swap(data,j,j
    -1);
    ????????
    ????}

    ????
    public?static?void?swap(int[]data,int?least,int?i){
    ????????
    int?tmp=data[least];
    ????????data[least]
    =data[i];
    ????????data[i]
    =tmp;
    ????}

    ????
    public?static?void?main(String?args[]){
    ????????
    int[]?t={10,29,12,23,56};
    ????????bubble_sort(t);
    ????????
    for(int?i:t){
    ????????????System.out.print(i
    +"?");
    ????????}
    ?
    ????}

    }


    3。算法效率:
    冒泡排序的比較次數近似是插入排序的兩倍,和選擇排序相同;移動次數和插入排序相同,是選擇排序的n倍。可以說,插入排序比冒泡排序快兩倍。
    主站蜘蛛池模板: 国产亚洲?V无码?V男人的天堂| 亚洲国产精品自在拍在线播放 | 亚洲精品tv久久久久| 国产高清视频在线免费观看| 免费看的一级毛片| 免费精品国产自产拍在线观看 | 亚洲乱码国产一区三区| 亚洲综合色视频在线观看| 亚洲精品国产精品乱码不卡| 亚洲精品亚洲人成在线观看下载| 亚洲福利精品一区二区三区| 亚洲国产一区明星换脸| 国产成人精品亚洲精品| 成人亚洲性情网站WWW在线观看| 日韩精品亚洲aⅴ在线影院| 亚洲精品无码专区久久久| 亚洲电影国产一区| 亚洲综合色丁香麻豆| 亚洲精品伊人久久久久| 亚洲老熟女五十路老熟女bbw | 国产性爱在线观看亚洲黄色一级片| 在线亚洲精品自拍| 亚洲福利在线视频| 亚洲激情视频网站| 亚洲宅男精品一区在线观看| 亚洲国产美女精品久久久| 男男gvh肉在线观看免费| 一级毛片免费播放视频| 永久免费av无码入口国语片| 98精品全国免费观看视频| 欧洲乱码伦视频免费| 日本一道综合久久aⅴ免费| 日韩视频在线免费| 无码天堂va亚洲va在线va| 一级毛片a免费播放王色电影 | 午夜在线亚洲男人午在线| 久久久久久久国产免费看| 91香蕉国产线在线观看免费| 99视频在线精品免费观看6| 国产资源免费观看| 久久精品国产亚洲AV不卡|