演算法 排序那些事

2021-08-02 16:00:55 字數 3538 閱讀 2269

1、通過比較相鄰兩個元素,把大的元素放在索引大的位置上,這樣比較n-1-i次後,就將最大的元素冒泡到最後面

2、這樣的過程要找n-1次

時間複雜度:

最好情況已經排好序o(n)

最差情況反序o(n^2)

private

static

void

bubbling(int a,int n)}}

}

private

static

void

bubbling1(int a,int n)

}posend = pos;

}}

氣泡排序改進2:

考慮到每次迴圈只找到最大的值或者最小的值,可以每次找到最小和最大的值嗎?

private static void bubbling2(int a,int n)

}high--;

for(j=high;j>low;j--)

}low++;

}}

分治法的思想

1、取乙個基數(這裡取第乙個元素)

2、讓小於這個基數的數放在基數的左邊,大於這個基數的數放在這個基數的右邊

3、遞迴過程1、2

重要的是過程2,從陣列的兩端遍歷,依次和基數進行判斷,右端如果大於基數(右端一定要先判斷,這樣最後兩端要相遇的時候,

保證了在數值小的地方相遇,然後相遇的地方與基數互換,當然,如果基數選擇的是最後乙個元素,那麼就要從左端開始判斷),

那麼++,左端如果小於基數,那麼–,當找到了右端的小於基數的值和左端的大於基數的值,如果左右兩端沒有遇到,交換這兩

個值,然後再判斷左右兩端是否遇到,如果沒遇到,那麼繼續這個過程,直到左右兩端遇到。

例如:3,9,5,2,6,1;1與9交換3,1,5,2,6,9;2與5交換3,1,2,5,6,9;這時high==low,2與3交換2,1,3,5,6,9,

這樣2,1在3的左邊,而5,6,9在3的右邊。

時間複雜度:

最好的情況是每次把上一次的陣列平均分成兩個子陣列。設陣列總數一共為n,如果把這n個數每次分成2半最後每個陣列只

包含乙個元素,假設要分k次,則2的k次方=n,解得k=log2n(log以2為底對n取對數).也就是說要分log2n次,而每次都

是處理n個資料。所以總的時間複雜度為o(nlog2n)。

private static void quicksort(int a,int

left,int

right)

while(lowif(lowleft]=a[low];

a[low]=key;

quicksort(a,left,low-1);

quicksort(a,low+1,right);

}}

從陣列第二個元素開始(第乙個元素已經排好序)當作插入值key,先判斷key是否比它左邊的哥們大,如果比它左邊的哥們大,那麼不需要插入,就在原位置就行了,

將key與排好序的從右到左依次作比較,如果key一直是小數,那麼就將比較值往右移位,直到找到乙個小於等於key或者找到最後乙個,就在這個位置上將key插入。

時間複雜度:

最好的情況下陣列已經排好序,線性複雜度o(n)

最差的情況下逆序o(n^2)

private

static

void

insertsort(int a,int n)

a[j]=key;}}

}

每次從待排序的陣列中找到最小值,然後放在固定的位置

首先設定第乙個元素是最小值,然後遍歷後面的元素與之比較,找出最小值min,記錄最小值的索引index(用於存放被最小值替換下來的值)

時間複雜度:

o(n^2)

private

static

void selectsort(int a,int n)

}temp = a[i];

a[i] = min;

a[index] = temp;

}}

1、建堆

2、將堆頂的元素和最後乙個元素替換,替換完,剩下的元素需要再次調整為堆

3、重複過程2,,直到替換了n-1次,完成排序

private

static

void

heapsort(int a,int n)

}

初始化堆

從最後乙個父節點開始,到堆頂,從下到上調整堆。

private

static

void

buildheap(int a, int n)

}

調整堆:

@parama陣列,n陣列的長度,i要調整的父節點

假設父節點是最大值,如果子節點不超出n(也就是子節點存在),那麼將子節點與父節點比較,將最大值設為父節點,

如果最大值是在子節點中,那麼將子節點的值與父節點的值替換後,被替換的子節點可能就不再是堆,需要調整以子節點為父節點成為堆。

直到子節點是葉子節點為止

private static void adjustheap(int a, int n, int i) 

if(rchildmax]max = rchild;

}if(i!=max)

}}

/**

* 歸併排序:

* 將陣列用遞迴進行二分分開,直到高位和低位相鄰的時候,分開結束,進行歸併排序

*@param a 待排序的陣列

*@param low 低位

*@param high 高位

*/private

static

void

mergesort(int a, int low, int high)

}

/**

* 將陣列a[low,mid]和a[mid+1,high]歸併排序到乙個新陣列,這個過程是這樣的:

* 1、取a[low]和a[mid+1]進行比較,然後將小者放進新陣列,新陣列位置+1,low+1,

* 大者也放進新陣列中,新陣列位置+1,mid+1+1,這個過程直到兩個陣列有乙個到達盡頭

* 2、將兩個陣列剩下的部分也放進新陣列中

* 3、這樣這個新資料就是兩個待排序的資料的歸併排序陣列,將這個新陣列複製到最終要排序的陣列a中,排序結束。

*@param a 帶排序

*@param low 低位

*@param mid 中位

*@param high 高位

*/private

static

void

merge(int a, int low, int mid, int high)

}while(i<=mid)

while(j<=high)

for(i=0;i}

快速排序的那些事

快速排序是最經典的演算法之一,應用無數,平均時間複雜度 nlgn 最差時間複雜度 n2 空間複雜度主要看呼叫深度,平均o lgn 最差o n 快速排序的分治思想可以用在很多地方,比如 一堆數中最大的幾個數等。通常在程式中直接使用庫函式即可,c語言qsort,c sort。用法,void qsort ...

那些人,那些事

很久沒有整理一下自己的思緒,聽著熟悉的歌,那歌聲會讓我想起那些人,那些事.乙個標點,乙個符號,乙個個早已在歲月深處冰封的眼神,一段沒有伴侶的歸途。一直以來我都認為我的人生就是這樣,平平淡淡,安安靜靜,波瀾不驚地在歲月的 眼角劃過,不留絲毫痕跡。現在看來,原來我寫的東西在很大程度上是是在滿足自己的某種...

那些人,那些事

一年前的今天,我大概和bi11一起奔波於各大招聘會上,白天各睡各的覺,晚上一起在工作室寫著程式 那時候似乎成都已經很冷,工作室有著溫暖的空調.而現在猛烈的陽光一件薄薄的襯衫真讓我不敢相信已經是十一月了.我在成都待了四年,說實話我不喜歡成都,不過還是有著很多讓人快樂的人和事給了我很多快樂的回憶.先說說...