真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java折半排序代碼 java實(shí)現(xiàn)各種排序算法

用二分法查找(折半查找)java

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲(chǔ)結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列。

創(chuàng)新互聯(lián)主營(yíng)尼瀘西網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,手機(jī)APP定制開(kāi)發(fā),尼瀘西h5成都微信小程序搭建,尼瀘西網(wǎng)站營(yíng)銷推廣歡迎尼瀘西等地區(qū)企業(yè)咨詢

二分查找優(yōu)缺點(diǎn)

優(yōu)點(diǎn)是比較次數(shù)少,查找速度快,平均性能好;

其缺點(diǎn)是要求待查表為有序表,且插入刪除困難。

因此,折半查找方法適用于不經(jīng)常變動(dòng)而查找頻繁的有序列表。

使用條件:查找序列是順序結(jié)構(gòu),有序。

過(guò)程

首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個(gè)子表,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進(jìn)一步查找前一子表,否則進(jìn)一步查找后一子表。重復(fù)以上過(guò)程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時(shí)查找不成功。

利用循環(huán)的方式實(shí)現(xiàn)二分法查找

public class BinarySearch {

public static void main(String[] args) {

// 生成一個(gè)隨機(jī)數(shù)組 ? ? ? ?int[] array = suiji();

// 對(duì)隨機(jī)數(shù)組排序 ? ? ? ?Arrays.sort(array);

System.out.println("產(chǎn)生的隨機(jī)數(shù)組為: " + Arrays.toString(array));

System.out.println("要進(jìn)行查找的值: ");

Scanner input = new Scanner(System.in);

// 進(jìn)行查找的目標(biāo)值 ? ? ? ?int aim = input.nextInt();

// 使用二分法查找 ? ? ? ?int index = binarySearch(array, aim);

System.out.println("查找的值的索引位置: " + index);

}

/** ? ? * 生成一個(gè)隨機(jī)數(shù)組 ? ? *

* @return 返回值,返回一個(gè)隨機(jī)數(shù)組 ? ? */

private static int[] suiji() {

// random.nextInt(n)+m ?返回m到m+n-1之間的隨機(jī)數(shù) ? ? ? ?int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循環(huán)遍歷為數(shù)組賦值 ? ? ? ?for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/** ? ? * 二分法查找 ?---循環(huán)的方式實(shí)現(xiàn) ? ? *

* @param array 要查找的數(shù)組 ? ? * @param aim 要查找的值 ? ? * @return 返回值,成功返回索引,失敗返回-1 ? ? */

private static int binarySearch(int[] array, int aim) {

// 數(shù)組最小索引值 ? ? ? ?int left = 0;

// 數(shù)組最大索引值 ? ? ? ?int right = array.length - 1;

int mid;

while (left = right) {

mid = (left + right) / 2;

// 若查找數(shù)值比中間值小,則以整個(gè)查找范圍的前半部分作為新的查找范圍 ? ? ? ? ? ?if (aim array[mid]) {

right = mid - 1;

// 若查找數(shù)值比中間值大,則以整個(gè)查找范圍的后半部分作為新的查找范圍 ? ? ? ? ? ?} else if (aim array[mid]) {

left = mid + 1;

// 若查找數(shù)據(jù)與中間元素值正好相等,則放回中間元素值的索引 ? } else {

return mid;

}

}

return -1;

}}

運(yùn)行結(jié)果演示:

由以上運(yùn)行結(jié)果我們得知,如果要查找的數(shù)據(jù)在數(shù)組中存在,則輸出該數(shù)據(jù)在數(shù)組中的索引;如果不存在則輸出 -1 ,也就是打印 -1 則該數(shù)在數(shù)組中不存在,反之則存在。

四、利用遞歸的方式實(shí)現(xiàn)二分法查找

public class BinarySearch2 {

public static void main(String[] args) {

// 生成一個(gè)隨機(jī)數(shù)組 ? ? ? ?int[] array = suiji();

// 對(duì)隨機(jī)數(shù)組排序 ? ? ? ?Arrays.sort(array);

System.out.println("產(chǎn)生的隨機(jī)數(shù)組為: " + Arrays.toString(array));

System.out.println("要進(jìn)行查找的值: ");

Scanner input = new Scanner(System.in);

// 進(jìn)行查找的目標(biāo)值 ? ? ? ?int aim = input.nextInt();

// 使用二分法查找 ? ? ? ?int index = binarySearch(array, aim, 0, array.length - 1);

System.out.println("查找的值的索引位置: " + index);

}

/** ? ? * 生成一個(gè)隨機(jī)數(shù)組 ? ? * ? ? * @return 返回值,返回一個(gè)隨機(jī)數(shù)組 ? ? */

private static int[] suiji() {

// Random.nextInt(n)+m ?返回m到m+n-1之間的隨機(jī)數(shù) ? ? ? ?int n = new Random().nextInt(6) + 5;

int[] array = new int[n];

// 循環(huán)遍歷為數(shù)組賦值 ? ? ? ?for (int i = 0; i array.length; i++) {

array[i] = new Random().nextInt(100);

}

return array;

}

/** ? ? * 二分法查找 ---遞歸的方式 ? ? * ? ? * @param array 要查找的數(shù)組 ? ? * @param aim ? 要查找的值 ? ? * @param left ?左邊最小值 ? ? * @param right 右邊最大值 ? ? * @return 返回值,成功返回索引,失敗返回-1 ? ? */

private static int binarySearch(int[] array, int aim, int left, int right) {

if (aim array[left] || aim array[right]) {

return -1;

}

// 找中間值 ? ? ? ?int mid = (left + right) / 2;

if (array[mid] == aim) {

return mid;

} else if (array[mid] aim) {

//如果中間值大于要找的值則從左邊一半繼續(xù)遞歸 ? ? ? ? ? ?return binarySearch(array, aim, left, mid - 1);

} else {

//如果中間值小于要找的值則從右邊一半繼續(xù)遞歸 ? ? ? ? ? ?return binarySearch(array, aim, mid + 1, array.length-1);

}

}}

運(yùn)行結(jié)果演示:

總結(jié):

遞歸相較于循環(huán),代碼比較簡(jiǎn)潔,但是時(shí)間和空間消耗比較大,效率低。在實(shí)際的學(xué)習(xí)與工作中,根據(jù)情況選擇使用。通常我們?nèi)绻褂醚h(huán)實(shí)現(xiàn)代碼只要不是太繁瑣都選擇循環(huán)的方式實(shí)現(xiàn)~

Java幾種簡(jiǎn)單的排序源代碼

給你介紹4種排序方法及源碼,供參考

1.冒泡排序

主要思路: 從前往后依次交換兩個(gè)相鄰的元素,大的交換到后面,這樣每次大的數(shù)據(jù)就到后面,每一次遍歷,最大的數(shù)據(jù)到達(dá)最后面,時(shí)間復(fù)雜度是O(n^2)。

public?static?void?bubbleSort(int[]?arr){

for(int?i?=0;?i??arr.length?-?1;?i++){

for(int?j=0;?j??arr.length-1;?j++){

if(arr[j]??arr[j+1]){

arr[j]?=?arr[j]^arr[j+1];

arr[j+1]?=?arr[j]^arr[j+1];

arr[j]?=?arr[j]^arr[j+1];

}

}

}

}

2.選擇排序

主要思路:每次遍歷序列,從中選取最小的元素放到最前面,n次選擇后,前面就都是最小元素的排列了,時(shí)間復(fù)雜度是O(n^2)。

public?static?void?selectSort(int[]?arr){

for(int?i?=?0;?i?arr.length?-1;?i++){

for(int?j?=?i+1;?j??arr.length;?j++){

if(arr[j]??arr[i]){

arr[j]?=?arr[j]^arr[i];

arr[i]?=?arr[j]^arr[i];

arr[j]?=?arr[j]^arr[i];

}

}

}

}

3.插入排序

主要思路:使用了兩層嵌套循環(huán),逐個(gè)處理待排序的記錄。每個(gè)記錄與前面已經(jīng)排好序的記錄序列進(jìn)行比較,并將其插入到合適的位置,時(shí)間復(fù)雜度是O(n^2)。

public?static?void?insertionSort(int[]?arr){

int?j;

for(int?p?=?1;?p??arr.length;?p++){

int?temp?=?arr[p];???//保存要插入的數(shù)據(jù)

//將無(wú)序中的數(shù)和前面有序的數(shù)據(jù)相比,將比它大的數(shù),向后移動(dòng)

for(j=p;?j0??temp?arr[j-1];?j--){

arr[j]?=?arr[j-1];

}

//正確的位置設(shè)置成保存的數(shù)據(jù)

arr[j]?=?temp;

}

}

4.希爾排序

主要思路:用步長(zhǎng)分組,每個(gè)分組進(jìn)行插入排序,再慢慢減小步長(zhǎng),當(dāng)步長(zhǎng)為1的時(shí)候完成一次插入排序,? 希爾排序的時(shí)間復(fù)雜度是:O(nlogn)~O(n2),平均時(shí)間復(fù)雜度大致是O(n^1.5)

public?static?void?shellSort(int[]?arr){

int?j?;

for(int?gap?=?arr.length/2;?gap??0?;?gap/=2){

for(int?i?=?gap;?i??arr.length;?i++){

int?temp?=?arr[i];

for(j?=?i;?j=gap??temparr[j-gap];?j-=gap){

arr[j]?=?arr[j-gap];

}

arr[j]?=?temp;

}

}

}

請(qǐng)給出java幾種排序方法

java常見(jiàn)的排序分為:

1 插入類排序

主要就是對(duì)于一個(gè)已經(jīng)有序的序列中,插入一個(gè)新的記錄。它包括:直接插入排序,折半插入排序和希爾排序

2 交換類排序

這類排序的核心就是每次比較都要“交換”,在每一趟排序都會(huì)兩兩發(fā)生一系列的“交換”排序,但是每一趟排序都會(huì)讓一個(gè)記錄排序到它的最終位置上。它包括:起泡排序,快速排序

3 選擇類排序

每一趟排序都從一系列數(shù)據(jù)中選擇一個(gè)最大或最小的記錄,將它放置到第一個(gè)或最后一個(gè)為位置交換,只有在選擇后才交換,比起交換類排序,減少了交換記錄的時(shí)間。屬于它的排序:簡(jiǎn)單選擇排序,堆排序

4 歸并類排序

將兩個(gè)或兩個(gè)以上的有序序列合并成一個(gè)新的序列

5 基數(shù)排序

主要基于多個(gè)關(guān)鍵字排序的。

下面針對(duì)上面所述的算法,講解一些常用的java代碼寫(xiě)的算法

二 插入類排序之直接插入排序

直接插入排序,一般對(duì)于已經(jīng)有序的隊(duì)列排序效果好。

基本思想:每趟將一個(gè)待排序的關(guān)鍵字按照大小插入到已經(jīng)排序好的位置上。

算法思路,從后往前先找到要插入的位置,如果小于則就交換,將元素向后移動(dòng),將要插入數(shù)據(jù)插入該位置即可。時(shí)間復(fù)雜度為O(n2),空間復(fù)雜度為O(1)

package sort.algorithm;

public class DirectInsertSort {

public static void main(String[] args) {

// TODO Auto-generated method stub

int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20 };

int temp, j;

for (int i = 1; i data.length; i++) {

temp = data[i];

j = i - 1;

// 每次比較都是對(duì)于已經(jīng)有序的

while (j = 0 data[j] temp) {

data[j + 1] = data[j];

j--;

}

data[j + 1] = temp;

}

// 輸出排序好的數(shù)據(jù)

for (int k = 0; k data.length; k++) {

System.out.print(data[k] + " ");

}

}

}

三 插入類排序之折半插入排序(二分法排序)

條件:在一個(gè)已經(jīng)有序的隊(duì)列中,插入一個(gè)新的元素

折半插入排序記錄的比較次數(shù)與初始序列無(wú)關(guān)

思想:折半插入就是首先將隊(duì)列中取最小位置low和最大位置high,然后算出中間位置mid

將中間位置mid與待插入的數(shù)據(jù)data進(jìn)行比較,

如果mid大于data,則就表示插入的數(shù)據(jù)在mid的左邊,high=mid-1;

如果mid小于data,則就表示插入的數(shù)據(jù)在mid的右邊,low=mid+1

最后整體進(jìn)行右移操作。

時(shí)間復(fù)雜度O(n2),空間復(fù)雜度O(1)

package sort.algorithm;

//折半插入排序

public class HalfInsertSort {

public static void main(String[] args) {

int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20 };

// 存放臨時(shí)要插入的元素?cái)?shù)據(jù)

int temp;

int low, mid, high;

for (int i = 1; i data.length; i++) {

temp = data[i];

// 在待插入排序的序號(hào)之前進(jìn)行折半插入

low = 0;

high = i - 1;

while (low = high) {

mid = (low + high) / 2;

if (temp data[mid])

high = mid - 1;

else

// low=high的時(shí)候也就是找到了要插入的位置,

// 此時(shí)進(jìn)入循環(huán)中,將low加1,則就是要插入的位置了

low = mid + 1;

}

// 找到了要插入的位置,從該位置一直到插入數(shù)據(jù)的位置之間數(shù)據(jù)向后移動(dòng)

for (int j = i; j = low + 1; j--)

data[j] = data[j - 1];

// low已經(jīng)代表了要插入的位置了

data[low] = temp;

}

for (int k = 0; k data.length; k++) {

System.out.print(data[k] + " ");

}

}

}

四 插入類排序之希爾排序

希爾排序,也叫縮小增量排序,目的就是盡可能的減少交換次數(shù),每一個(gè)組內(nèi)最后都是有序的。

將待續(xù)按照某一種規(guī)則分為幾個(gè)子序列,不斷縮小規(guī)則,最后用一個(gè)直接插入排序合成

空間復(fù)雜度為O(1),時(shí)間復(fù)雜度為O(nlog2n)

算法先將要排序的一組數(shù)按某個(gè)增量d(n/2,n為要排序數(shù)的個(gè)數(shù))分成若干組,每組中記錄的下標(biāo)相差d.對(duì)每組中全部元素進(jìn)行直接插入排序,然后再用一個(gè)較小的增量(d/2)對(duì)它進(jìn)行分組,在每組中再進(jìn)行直接插入排序。當(dāng)增量減到1時(shí),進(jìn)行直接插入排序后,排序完成。

package sort.algorithm;

public class ShellSort {

public static void main(String[] args) {

int a[] = { 1, 54, 6, 3, 78, 34, 12, 45, 56, 100 };

double d1 = a.length;

int temp = 0;

while (true)

{

//利用這個(gè)在將組內(nèi)倍數(shù)減小

//這里依次為5,3,2,1

d1 = Math.ceil(d1 / 2);

//d為增量每個(gè)分組之間索引的增量

int d = (int) d1;

//每個(gè)分組內(nèi)部排序

for (int x = 0; x d; x++)

{

//組內(nèi)利用直接插入排序

for (int i = x + d; i a.length; i += d) {

int j = i - d;

temp = a[i];

for (; j = 0 temp a[j]; j -= d) {

a[j + d] = a[j];

}

a[j + d] = temp;

}

}

if (d == 1)

break;

}

for (int i = 0; i a.length; i++)

System.out.print(a[i]+" ");

}

}

五 交換類排序之冒泡排序

交換類排序核心就是每次比較都要進(jìn)行交換

冒泡排序:是一種交換排序

每一趟比較相鄰的元素,較若大小不同則就會(huì)發(fā)生交換,每一趟排序都能將一個(gè)元素放到它最終的位置!每一趟就進(jìn)行比較。

時(shí)間復(fù)雜度O(n2),空間復(fù)雜度O(1)

package sort.algorithm;

//冒泡排序:是一種交換排序

public class BubbleSort {

// 按照遞增順序排序

public static void main(String[] args) {

// TODO Auto-generated method stub

int data[] = { 2, 6, 10, 3, 9, 80, 1, 16, 27, 20, 13, 100, 37, 16 };

int temp = 0;

// 排序的比較趟數(shù),每一趟都會(huì)將剩余最大數(shù)放在最后面

for (int i = 0; i data.length - 1; i++) {

// 每一趟從開(kāi)始進(jìn)行比較,將該元素與其余的元素進(jìn)行比較

for (int j = 0; j data.length - 1; j++) {

if (data[j] data[j + 1]) {

temp = data[j];

data[j] = data[j + 1];

data[j + 1] = temp;

}

}

}

for (int i = 0; i data.length; i++)

System.out.print(data[i] + " ");

}

}

用JAVA實(shí)現(xiàn)折半插入排序的題目

別忘記給分哦

package com.adtech.interf.test;

public class Test{

public Test(Record a[]) {

int i, j, m, low, high;

Record temp;

for (i = 0; i a.length; i++) {

temp = a[i];

low = 0;

high = i;

while (low = high) {

m = (low + high) / 2;

if (temp.getStudentID() a[m].getStudentID()) {

high = m - 1;

} else {

low = m + 1;

}

}

for (j = i; j high + 1 j 0; j--) { // 如果jhigh 就會(huì)少遍歷一個(gè)元素 || jlow

a[j] = a[j - 1];

}

a[j] = temp;

}

for (int t = 0; t a.length; t++) {

System.out.println(a[t].getStudentID());

}

}

public static void main(String args[]) {

Record record1 = new Record(2,"張三1",81.0,18);

Record record2 = new Record(4,"張三2",82.0,11);

Record record3 = new Record(5,"張三3",83.0,12);

Record record4 = new Record(43,"張三4",84.0,13);

Record record5 = new Record(21,"張三5",85.0,14);

Record record6 = new Record(54,"張三6",86.0,15);

Record record7 = new Record(22,"張三7",87.0,16);

Record record8 = new Record(6,"張三4",88.0,17);

Record record9 = new Record(223,"張三9",89.0,18);

Record record10 = new Record(545,"張三10",80.0,19);

Record [] record = new Record[]{record1,record2,record3,record4,

record5,record6,record7,record8,record9,record10};

new Test(record);

}

}


網(wǎng)站題目:Java折半排序代碼 java實(shí)現(xiàn)各種排序算法
URL地址:http://weahome.cn/article/doposge.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部