排序演算法編程
演算法思想簡單描述:
在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上
而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較
小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要
求相反時,就將它們互換。
下面是一種改進的冒泡演算法,它記錄了每一遍掃描後最後下沉數的
位置k,這樣可以減少外層循環掃描的次數。
冒泡排序是穩定的。演算法時間復雜度O(n^2)
演算法實現:
/*
功能:冒泡排序
輸入:數組名稱(也就是數組首地址)、數組中元素個數
*/
void bubble_sort(int *x, int n)
{
int j, k, h, t;
for (h=n-1; h>0; h=k) /*循環到沒有比較范圍*/
{
for (j=0, k=0; j<h; j++) /*每次預置k=0,循環掃描後更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在後面,小的放到前面*/
{
t = *(x+j);
*(x+j) = *(x+j+1);
*(x+j+1) = t; /*完成交換*/
k = j; /*保存最後下沉的位置。這樣k後面的都是排序排好了的。*/
}
}
}
}
2. 計算機編程,求一個排序演算法
1、進行唯一性索引,把每個出現的值列出;
2、利用索引,逐個在源數據中計算每種數值出現個數,並記錄在其他欄位;
3、以新的欄位從多到少排序;
4、依據數值名稱和個數進行數值列出就可以了。
3. 幾種經典排序演算法優劣比較的C++程序實現
一、低級排序演算法
1.選擇排序
(1)排序過程
給定一個數值集合,循環遍歷集合,每次遍歷從集合中選擇出最小或最大的放入集合的開頭或結尾的位置,下次循環從剩餘的元素集合中遍歷找出最小的並如上操作,最後直至所有原集合元素都遍歷完畢,排序結束。
(2)實現代碼
//選擇排序法
template
void Sort::SelectSort(T* array, int size)
{
int minIndex;
for(int i = 0; i < size; i++)
{
minIndex = i;
for(int j = i + 1; j < size; j++)
{
if(array[minIndex] > array[j])
{
minIndex = j;
}
}
if(minIndex != i)
{
Swap(array, i, minIndex);
}
}
}
(3)分析總結
選擇排序時間復雜度比較高,達到了O(n^2),每次選擇都要遍歷一遍無序區間。選擇排序對一類重要的元素序列具有較好的效率,就是元素規模很大,而排序碼卻比較小的序列。另外要說明的是選擇排序是一種不穩定的排序方法。
2.冒泡排序
(1)排序過程
冒泡排序的過程形如其名,就是依次比較相鄰兩個元素,優先順序高(或大或小)的元素向後移動,直至到達序列末尾,無序區間就會相應地縮小。下一次再從無序區間進行冒泡操作,依此循環直至無序區間為1,排序結束。
(2)實現代碼
//冒泡排序法
template
void Sort::BubbleSort(T* array, int size)
{
for(int i = 0; i < size; i++)
{
for(int j = 1; j < size - i; j++)
{
if(array[j] < array[j - 1])
{
Swap(array, j, j - 1);
}
}
}
}
(3)分析總結
冒泡排序的時間復雜度也比較高,達到O(n^2),每次遍歷無序區間都將優先順序高的元素移動到無序區間的末尾。冒泡排序是一種穩定的排序方式。
二、高級排序演算法
(1)排序過程
歸並排序的原理比較簡單,也是基於分治思想的。它將待排序的元素序列分成兩個長度相等的子序列,然後為每一個子序列排序,然後再將它們合並成一個序列。
(2)實現代碼
//歸並排序
template
void Sort::MergeSort(T* array, int left, int right)
{
if(left < right)
{
int mid = (left + right) / 2;
MergeSort(array, left, mid);
MergeSort(array, mid + 1, right);
Merge(array, left, mid, right);
}
}
//合並兩個已排好序的子鏈
template
void Sort::Merge(T* array, int left, int mid, int right)
{
T* temp = new T[right - left + 1];
int i = left, j = mid + 1, m = 0;
while(i <= mid && j <= right)
{
if(array[i] < array[j])
{
temp[m++] = array[i++];
}
else
{
temp[m++] = array[j++];
}
}
while(i <= mid)
{
temp[m++] = array[i++];
}
while(j <= right)
{
temp[m++] = array[j++];
}
for(int n = left, m = 0; n <= right; n++, m++)
{
array[n] = temp[m];
}
delete temp;
}
(3)分析總結
歸並排序最好、最差和平均時間復雜度都是O(nlogn),是一種穩定的排序演算法。
4. 用c語言編程實現快速排序演算法
給個快速排序你參考參考
/**********************快速排序****************************
基本思想:在待排序的n個記錄中任取一個記錄(通常取第一個記錄),
以該記錄為基準,將當前的無序區劃分為左右兩個較小的無
序子區,使左邊的記錄均小於基準值,右邊的記錄均大於或
等於基準值,基準值位於兩個無序區的中間位置(即該記錄
最終的排序位置)。之後,分別對兩個無序區進行上述的劃
分過程,直到無序區所有記錄都排序完畢。
*************************************************************/
/*************************************************************
函數名稱:staticvoidswap(int*a,int*b)
參數:int*a---整型指針
int*b---整型指針
功能:交換兩個整數的位置
返回值:無
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticvoidswap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}
intquickSortNum=0;//快速排序演算法所需的趟數
/*************************************************************
函數名稱:staticintpartition(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成一趟快速排序
返回值:基準值的最終排序位置
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticintpartition(inta[],intlow,inthigh)
{
intprivotKey=a[low];//基準元素
while(low<high)
{//從表的兩端交替地向中間掃描
while(low<high&&a[high]>=privotKey)//找到第一個小於privotKey的值
high--;//從high所指位置向前搜索,至多到low+1位置
swap(&a[low],&a[high]);//將比基準元素小的交換到低端
while(low<high&&a[low]<=privotKey)//找到第一個大於privotKey的值
low++;//從low所指位置向後搜索,至多到high-1位置
swap(&a[low],&a[high]);//將比基準元素大的交換到高端
}
quickSortNum++;//快速排序趟數加1
returnlow;//返回基準值所在的位置
}
/*************************************************************
函數名稱:voidQuickSort(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成快速排序演算法,並將排序完成的數據存放在數組a中
返回值:無
說明:使用遞歸方式完成
**************************************************************/
voidQuickSort(inta[],intlow,inthigh)
{
if(low<high)
{
intprivotLoc=partition(a,low,high);//將表一分為二
QuickSort(a,low,privotLoc-1);//遞歸對低子表遞歸排序
QuickSort(a,privotLoc+1,high);//遞歸對高子表遞歸排序
}
}
5. 編程演算法有哪些
具體演算法如下:
1、快速排序演算法快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序n個項目要Ο(nlogn)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。
2、堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
3、歸並排序(Mergesort,台灣譯作:合並排序)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(DivideandConquer)的一個非常典型的應用。
4、二分查找演算法是一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束。
5、BFPRT演算法解決的問題十分經典,即從某n個元素的序列中選出第k大(第k小)的元素,通過巧妙的分析,BFPRT可以保證在最壞情況下仍為線性時間復雜度。
6、深度優先搜索演算法,是搜索演算法的一種。它沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。
6. c語言做各種排序演算法比較程序怎麼做
按照程序設計的自頂向下,逐步求精的機構化程序設計思想來完成這個任務。
①大概的頂層框架是:隨機數產生模塊,文件保存模塊,排序以及統計排序過程信息的模塊。
②分別設計出隨機數產生演算法,三種排序演算法。
③按照邏輯的順序進行組裝,並給出必要的過程信息。
演算法的設計實現以及程序運行結果:
7. 用C語言編程:用選擇法對10個整數排序,10個整數用scanf函數輸入
1、打開visual C++ 6.0,准備一個空白的c語言文件,引入頭文件,在main函數中定義變數和數組:
8. 排序演算法 java編程
public class Sort
{
//選擇排序
public static void selectSort(char[] data)
{
int i,j,mx;
char temp;
for(i = 0; i<data.length-1; i++)
{
mx = i ;
for(j = i+1 ; j<data.length; j++)
{
if(data[mx] < data[j])
mx = j ;
}
temp = data[i];
data[i] = data[mx];
data[mx] = temp;
}
}
//插入排序
public static void insertSort(char[] data)
{
int i,j,mx;
char key ;
for(i=1; i < data.length -1; i++)
{
key = data[i];
mx = i;
for(j= i-1;j>0;j--)
{
if(key>data[j])
{
data[j+1] = data[j];
mx = j ;
}
}
data[mx]=key;
}
}
//顯示數據
public static void showData(char[] data)
{
int i;
for(i=0; i<data.length; i++)
System.out.print(data[i]+" ");
System.out.println();
}
public static void main(String[] args)
{
char[] data = {'9','8','7','6','5','4','3','2','1'};
Sort.selectSort(data);
Sort.showData(data);
Sort.insertSort(data);
Sort.showData(data);
}
}
這個程序還不夠你的要求,你可以再修改修改
9. Web前端工程師你知道JavaScript中常用的排序演算法嗎
今天小編要跟大家分享的文章是關於JavaScript中常用的排序演算法。相信很多剛剛從事Web前端工作或者准備面試的小夥伴們對此還不是很了解,下面就讓小編來為大家介紹一下吧!
一、冒泡排序
冒泡排序是我們在編程演算法中,算是比較常用的排序演算法之一,在學習階段,也是最需要接觸理解的演算法,所以我們放在第一個來學習。
演算法介紹:
·___冉舷嗔詰牧礁鱸,如果前一個比後一個大,則交換位置。
·___諞宦職炎畲蟮腦胤諾攪俗詈竺妗
·___捎諉看聞判蜃詈笠桓齠際親畲蟮模災蟀湊詹街1排序最後一個元素不用比較。
冒泡演算法改進:
設置一個標志,如果這一趟發生了交換,則為true。否則為false。如果這一趟沒有發生交換,則說明排序已經完成。代碼如下:
假如數組長度是20,如果只有前十位是無序排列的,後十位是有序且都大於前十位,所以第一趟遍歷排序的時候發生交換的位置必定小於10,且該位置之後的必定有序,我們只需要排序好該位置之前的就可以,因此我們要來標記這個位置就可以了,即可以記錄每次掃描中最後一次交換的位置,下次掃描的時候只要掃描到上次的最後交換位置就行了,因為後面的都是已經排好序的,無需再比較,代碼如下:
每一次循環從兩頭出發算出最大和最小值,代碼如下:
在代碼3的基礎上記錄每次掃描最後一次交換的位置,下次掃描的時候只要掃描到上次的最後交換位置就行,同代碼2,代碼如下:
二、快速排序
演算法介紹:
快速排序是對冒泡排序的一種改進,第一趟排序時將數據分成兩部分,一部分比另一部分的所有數據都要小。然後遞歸調用,在兩邊都實行快速排序。
三、選擇排序
演算法介紹:
選擇排序就是從一個未知數據空間里,選取之最放到一個新的空間
四、插入排序
演算法介紹:
·___擁諞桓瞿媳慌藕眯虻腦乜
·___〕魷亂桓鱸兀諞丫判虻腦匭蛄兄寫雍笙蚯吧_
·___綣雅判虻腦卮笥諶〕齙腦兀蚪浞直鶼蚝笠貧晃
·___鋇秸業揭雅判虻腦刂行∮諢虻扔諶〕齙腦兀〕齙腦胤諾剿暮笠晃
·___馗床街2
插入排序演算法改進-二分法插入排序:
以上就是小編今天為大家分享的JavaScript中常用的排序演算法的文章,文章中介紹的是四種比較基礎的排序方法,JavaScript的排序演算法還有很多,這是我們4種最常見也是最基本的演算法,掌握理解好,在面試和開發中也能從容應對了。想要了解更多Web前端知識記得關注北大青鳥Web培訓官網哦。最後祝願小夥伴們工作順利!
本文轉自前端研究所。
*聲明:內容與圖片均來源於網路(部分內容有修改),版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。