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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)

發(fā)布時間:2024/1/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載:http://blog.csdn.net/pzhtpf/article/details/7559943

3.簡單選擇排序

1)基本思想:在要排序的一組數(shù)中,選出最小的一個數(shù)與第一個位置的數(shù)交換;

然后在剩下的數(shù)當(dāng)中再找最小的與第二個位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個數(shù)和最后一個數(shù)比較為止。

2)實例:

3)用Java實現(xiàn)

[plain]?view plaincopy
  • publicclass?selectSort?{??
  • ??
  • ????public?selectSort(){??
  • ??
  • ???????int?a[]={1,54,6,3,78,34,12,45};??
  • ??
  • ???????int?position=0;??
  • ??
  • ???????for(int?i=0;i<a.length;i++){??
  • ??
  • ?????????????
  • ??
  • ???????????int?j=i+1;??
  • ??
  • ???????????position=i;??
  • ??
  • ???????????int?temp=a[i];??
  • ??
  • ???????????for(;j<a.length;j++){??
  • ??
  • ???????????if(a[j]<temp){??
  • ??
  • ??????????????temp=a[j];??
  • ??
  • ??????????????position=j;??
  • ??
  • ???????????}??
  • ??
  • ???????????}??
  • ??
  • ???????????a[position]=a[i];??
  • ??
  • ???????????a[i]=temp;??
  • ??
  • ???????}??
  • ??
  • ???????for(int?i=0;i<a.length;i++)??
  • ??
  • ???????????System.out.println(a[i]);??
  • ??
  • ????}??
  • ??
  • }??

  • ?

    ?

    4,堆排序

    (1)基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進(jìn)。

    堆的定義如下:具有n個元素的序列(h1,h2,...,hn),當(dāng)且僅當(dāng)滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)時稱之為堆。在這里只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項(大頂堆)。完全二叉樹可以很直觀地表示堆的結(jié)構(gòu)。堆頂為根,其它為左子樹、右子樹。初始時把要排序的數(shù)的序列看作是一棵順序存儲的二叉樹,調(diào)整它們的存儲序,使之成為一個堆,這時堆的根節(jié)點的數(shù)最大。然后將根節(jié)點與堆的最后一個節(jié)點交換。然后對前面(n-1)個數(shù)重新調(diào)整使之成為堆。依此類推,直到只有兩個節(jié)點的堆,并對它們作交換,最后得到有n個節(jié)點的有序序列。從算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最后一個元素交換位置。所以堆排序有兩個函數(shù)組成。一是建堆的滲透函數(shù),二是反復(fù)調(diào)用滲透函數(shù)實現(xiàn)排序的函數(shù)。

    (2)實例:

    初始序列:46,79,56,38,40,84

    建堆:

    交換,從堆中踢出最大數(shù)

    剩余結(jié)點再建堆,再交換踢出最大數(shù)

    依次類推:最后堆中剩余的最后兩個結(jié)點交換,踢出一個,排序完成。

    (3)用java實現(xiàn)

    [plain]?view plaincopy
  • import?java.util.Arrays;??
  • ??
  • ???
  • ??
  • publicclass?HeapSort?{??
  • ??
  • ?????inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};??
  • ??
  • ????public??HeapSort(){??
  • ??
  • ???????heapSort(a);??
  • ??
  • ????}??
  • ??
  • ????public??void?heapSort(int[]?a){??
  • ??
  • ????????System.out.println("開始排序");??
  • ??
  • ????????int?arrayLength=a.length;??
  • ??
  • ????????//循環(huán)建堆??
  • ??
  • ????????for(int?i=0;i<arrayLength-1;i++){??
  • ??
  • ????????????//建堆??
  • ??
  • ????????????buildMaxHeap(a,arrayLength-1-i);??
  • ??
  • ????????????//交換堆頂和最后一個元素??
  • ??
  • ????????????swap(a,0,arrayLength-1-i);??
  • ??
  • ????????????System.out.println(Arrays.toString(a));??
  • ??
  • ????????}??
  • ??
  • ????}??
  • ??
  • ???
  • ??
  • ????private??void?swap(int[]?data,?int?i,?int?j)?{??
  • ??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??
  • ????????int?tmp=data[i];??
  • ??
  • ????????data[i]=data[j];??
  • ??
  • ????????data[j]=tmp;??
  • ??
  • ????}??
  • ??
  • ????//對data數(shù)組從0到lastIndex建大頂堆??
  • ??
  • ????privatevoid?buildMaxHeap(int[]?data,?int?lastIndex)?{??
  • ??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??
  • ????????//從lastIndex處節(jié)點(最后一個節(jié)點)的父節(jié)點開始??
  • ??
  • ????????for(int?i=(lastIndex-1)/2;i>=0;i--){??
  • ??
  • ????????????//k保存正在判斷的節(jié)點??
  • ??
  • ????????????int?k=i;??
  • ??
  • ????????????//如果當(dāng)前k節(jié)點的子節(jié)點存在??
  • ??
  • ????????????while(k*2+1<=lastIndex){??
  • ??
  • ????????????????//k節(jié)點的左子節(jié)點的索引??
  • ??
  • ????????????????int?biggerIndex=2*k+1;??
  • ??
  • ????????????????//如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節(jié)點的右子節(jié)點存在??
  • ??
  • ????????????????if(biggerIndex<lastIndex){??
  • ??
  • ????????????????????//若果右子節(jié)點的值較大??
  • ??
  • ????????????????????if(data[biggerIndex]<data[biggerIndex+1]){??
  • ??
  • ????????????????????????//biggerIndex總是記錄較大子節(jié)點的索引??
  • ??
  • ????????????????????????biggerIndex++;??
  • ??
  • ????????????????????}??
  • ??
  • ????????????????}??
  • ??
  • ????????????????//如果k節(jié)點的值小于其較大的子節(jié)點的值??
  • ??
  • ????????????????if(data[k]<data[biggerIndex]){??
  • ??
  • ????????????????????//交換他們??
  • ??
  • ????????????????????swap(data,k,biggerIndex);??
  • ??
  • ????????????????????//將biggerIndex賦予k,開始while循環(huán)的下一次循環(huán),重新保證k節(jié)點的值大于其左右子節(jié)點的值??
  • ??
  • ????????????????????k=biggerIndex;??
  • ??
  • ????????????????}else{??
  • ??
  • ????????????????????break;??
  • ??
  • ????????????????}??
  • ??
  • ????????????}??
  • ??
  • ????????}??
  • ??
  • ????}??
  • ??
  • ???
  • ??
  • ???
  • ??
  • } ?

  • 總結(jié)

    以上是生活随笔為你收集整理的程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。