日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序第一天,回忆关键字

發布時間:2023/12/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序第一天,回忆关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  選擇,插入,希爾,歸并,快排(包括三向快排),堆排序。

  選擇:

    實現原理:內外循環,選擇最小,比較。

    關鍵點:for(k =i+1 ,k<N,k++){a[j]<a[min],min=j}

  插入:

     實現原理:往左插入最小

    關鍵點:for(int j = i+1, k > 0 && less(a[j],a[j-1],j--)

  希爾:

    實現原理:插入的改進,使用遞增序列0,1,4,13………………,分組插入

    關鍵點:

    while(h<N/3){

      h=3*h+1;

     for(int j = i, j >= h && less(a[j],a[j-h],j=j-h)

?

    ?  h=h/3;

    }

  歸并:

    實現原理:原地,自頂向下,自底向上,遞歸,使整體分成小數組

    關鍵點:

      mergesort(a,lo,mid);

mergesort(a,mid+1,hi);

merge(a,lo,mid,hi);

for (int k = lo; k <= hi; k++)
if (i > mid)
a[k] = aux[j++];
else if (j > hi)
a[k] = aux[i++];
else if (SortUtils.less(aux[j], aux[i]))
a[k] = aux[j++];
else
a[k] = aux[i++];

}

?

快排:

 實現原理:選擇a[lo]第一次,從右往左搜比他大,從左往右搜比他小,就是a[++i]、a[--j]與a[lo]=v對比,小于 大于,三項添加等于

 關鍵點:切分partition

while (SortUtils.less(a[++i], v))
if (i == hi)
break;
while (SortUtils.less(v, a[--j]))
if (j == lo)
break;
if (i >= j) {
break;
}

?

堆排序

   實現原理:優先隊列,有序化,sink

   關鍵點:for用來構建堆有序,while使用來sink,從a[1]使用,后面exch和less減一

    

int N = a.length;
for (int i = N / 2; i >= 1; i--) {
sink(a, i, N);
}
while (N > 1) {
exch(a, 1, N--);
sink(a, 1, N);
}
}

?

private static void sink(Comparable[] a, int j, int n) {
while (2 * j <= n) {
int h = 2 * j;
if (h < n && less(a, h, h + 1)) {
h++;
}
if (!less(a, j, h)) {
break;
}
exch(a, j, h);
j = h;
}

}

    

轉載于:https://www.cnblogs.com/ykong/p/4321266.html

總結

以上是生活随笔為你收集整理的排序第一天,回忆关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。