常用排序演算法程式碼測試
以上列舉了幾種常見排序演算法的實現方式,僅供參考,程式碼均測試無誤。#include <stdio.h> #define N 10 //測試陣列長度 //交換變數值 void swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } //列印一次排序結果 void printResult(int a[],int n) { int i; for(i=0;i<n;i++) printf("%d ",a[i]); printf("\n"); } //直接插入排序 void InsertSort(int L[],int length) { int i,j; for(i=1;i<length;i++){ j=i; if(L[j]<L[i-1]){ int temp=L[j]; while(temp<L[j-1]&&j!=0){ L[j]=L[j-1]; j--; } L[j]=temp; } printResult(L,length); } } //氣泡排序 void BubbleSort(int L[],int length) { int i,j; for(i=0;i<length-1;i++){ for(j=1;j<length;j++) if(L[j]<L[j-1]) { swap(L+j,L+j-1); } printResult(L,length); } } //選擇排序 void SelectSort(int L[],int length) { int i,j,t; for(i=0;i<length;i++){ t=i; for(j=i+1;j<length;j++){ if(L[j]<L[t]) t=j; } if(t!=i){ swap(L+i,L+t); } printResult(L,length); } } void Shell(int L[],int d) { int i,j,t; int temp; for(i=d;i<N;i++){ if(L[i]<L[i-d]){ temp=L[i]; j=i; while(j-d>=0&&temp<L[j-d]){ L[j]=L[j-d]; j-=d; } L[j]=temp; } printResult(L,N); } } //希爾排序 void ShellSort(int L[],int d) { while(d>=1){ printf("d=%d\n",d); Shell(L,d); d/=2; } } void Merge(int L[],int head,int mid,int tail) { int T[N]={0}; int i=0,j=mid+1,k=0; while((head+i)<=mid&&j<=tail){ if(L[head+i]<L[j]){ T[k++]=L[head+i]; i++; }else{ T[k++]=L[j++]; } } while((head+i)<=mid){ T[k++]=L[head+i]; i++; } while(j<=tail)T[k++]=L[j++]; for(i=0;i<k;i++)L[head+i]=T[i]; printResult(L,N); } //歸併排序 void MergeSort(int L[],int head,int tail) { int mid=0; if(head<tail){ mid=(head+tail)/2; MergeSort(L,head,mid); MergeSort(L,mid+1,tail); Merge(L,head,mid,tail); } } int Partition(int L[],int low,int high) { int pivot=L[low]; int temp; while(low<high){ while(low<high && L[high]>=pivot){ high--; } swap(&L[low],&L[high]); while(low<high && L[low]<=pivot){ low++; } swap(&L[low],&L[high]); } printResult(L,N); return low; } //快速排序 void QuickSort(int L[],int low,int high) { if(low<high){ int head=low; int tail=high; int n=Partition(L,head,tail); QuickSort(L,low,n); QuickSort(L,n+1,high); } } void HeapAdjust(int *a,int i,int size) { int max=i; int lchild=2*i+1,rchild=2*i+2; if(i<(size-1)/2){ if(lchild<size && a[lchild]>a[max]){ max=lchild; } if(rchild<size && a[rchild]>a[max]){ max=rchild; } if(i!=max){ swap(a+i,a+max); HeapAdjust(a,max,size); } } } void BuildHeap(int *a,int size) { int i; for(i=size/2-1;i>=0;i--){ HeapAdjust(a,i,size); } } //堆排序 void HeapSort(int *a,int size) { int i; BuildHeap(a,size); for(i=size-1;i>=0;i--){ swap(a,a+i); HeapAdjust(a,0,i-1); printResult(a,size); } } void main() { int a[10]={5,9,2,6,5,2,4,10,8,3}; //InsertSort(a,10); //BubbleSort(a,10); //SelectSort(a,10); //ShellSort(a,3); //MergeSort(a,0,9); //QuickSort(a,0,9); HeapSort(a,10); }
相關推薦
常用排序演算法程式碼測試
#include <stdio.h> #define N 10 //測試陣列長度 //交換變數值 void swap(int *a,int *b) { int t; t=*a; *a=*b; *b=t; } //列印一次排序結果 void prin
常用排序演算法java程式碼實現---快速排序,氣泡排序,選擇排序
快速排序 public class QuickSort { public void qSort(int[] arr,int left,int right) { if(left>right) { return ; } int i = le
幾大常用排序演算法編寫及正確性、效率測試
排序演算法寫了幾遍,總是過段時間就忘,故在此彙總下。 寫排序演算法重要的是理解它的原理,找到如何遍歷及遍歷和終止的條件 插入排序 從左建立有序區,將右側的值依次插入該有序區,有序區中從插入的位置開始依次後移一位;從左往右遍歷 void InsertSor
Java 常用排序演算法總結
氣泡排序: /*冒泡演算法*/ public class BubbleSort { public static void bubble_sort(int[] arr){ int temp; for(int i = 0; i < arr
常用排序演算法的時間複雜度和空間複雜度及特點
一、常用排序演算法的時間複雜度和空間複雜度表格 二、特點 1.歸併排序: (1)n大時好,歸併比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高且穩定的排序演算法。 (2)歸併排序每次遞迴都要用到一個輔助表,長度與待排序的表長度相同,雖然遞迴次數是O(log2n),但每次
氣泡排序、選擇排序、插入排序、快速排序演算法耗時測試
import java.util.*; public class Test1 { public static void main(String[] args) throws Exception{ int[] arr1=new int[20000]; for(int i=0;i&l
Java種八種常用排序演算法
目錄: 1.直接插入排序 2.希爾排序 3.簡單選擇排序 4.堆排序 5.氣泡排序 6.快速排序 7.歸併排序 8.基數排序 1. 直接插入排序 經常碰到這樣一類排序問題:把新的資料插入到已經排好的資料列中。 將第一個數和第二個數排序,然後構成一個有序序列 將第三個數插
c語言實現常用排序演算法
#include <stdio.h> #include <stdlib.h> #define arrLen(arr) sizeof(arr)/sizeof(arr[0]) void print(int arr[], int len) { int i = 0; fo
資料結構與演算法:常用排序演算法總結
排序演算法穩定性的簡單形式化定義為:如果Ai = Aj,排序前Ai在Aj之前,排序後Ai還在Aj之前,則稱這種排序演算法是穩定的。通俗地講就是保證排序前後兩個相等的數的相對順序不變。 對於不穩定的排序演算法,只要舉出一個例項,即可說明它的不穩定性;而對於穩定的排序演算法,必須對演算
常用排序演算法中的時間複雜度和空間複雜度
排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 O(n2) O(n2) 穩定 O(1) 快速排序 O(n2) O(n*log2n) 不穩定 O(log2n)~O(n) 選擇排序 O(n2) O(n2) 不穩定
八種常用排序演算法(Java)
01演算法分類 02時間複雜度 03相關概念 穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。 不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面。 時間複雜度:對排序資料的總的操作次數。反映當n變化時,操作次數呈現什麼規律。
機器學習——常用排序演算法總結
我們通常所說的排序演算法往往指的是內部排序演算法,即資料記錄在記憶體中進行排序。排序演算法大體可分為兩種: 一種是比較排序,時間複雜度O(nlogn) ~ O(n^2),主要有:氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。 另一種是非比較排序,時間複雜度可以達到O(
幾種常用排序演算法的思路和複雜度對比
1、插入排序——直接插入排序、希爾排序 (1)直接插入排序思路:從第1號元素開始,每個元素依次與前面的元素做比較,小的排前面,這樣當比較到最後一 個元 素完即完成排序。 (2)希爾排序思路:
常用排序演算法C++實現
#ifndef SORT_H #define SORT_H class Sort { private: Sort(); Sort(const Sort&); Sort& operator = (const Sort&); te
常用排序演算法
常用演算法總結 最近為了面試,在惡補演算法的一些知識,算是嚐到了大學沒有好好學習苦頭,博文是轉載的,我為了加深一些映像就自己寫一篇,順便加了一些自己的理解,有錯誤的話希望各位能夠指正。 排序演算法大體可分為兩種: 一種是比較排序,時間複雜度O(nlogn) ~
常用HASH演算法 程式碼 & 比較
其中資料1為100000個字母和數字組成的隨機串雜湊衝突個數。資料2為100000個有意義的英文句子雜湊衝突個數。資料3為資料1的雜湊值與1000003(大素數)求模後儲存到線性表中衝突的個數。資料4為資料1的雜湊值與10000019(更大素數)求模後儲存到線性表中衝突的個數。 經過比較,得出以上平均得分。
java實現常用排序演算法
陣列排序問題是java工程師面試過程中很常見的問題之一,也是java程式設計師必備的知識。本文總結了用java實現常用的排序演算法。 注:陣列從小到大排序 1. 氣泡排序 特點:效率低,實現簡單,容易理解 思想:每一次遍歷,將待排序中最大的元素移到最後,剩下的為新的待
JavaScript常用排序演算法總結
(一)氣泡排序 原理: 比較相鄰的元素,如果第一個比第二個大,就交換他們兩個; 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對; 在這一點,最後的元素應該會是最大的數; 針對所有的元素重複
常用排序演算法:直接選擇排序
直接選擇排序演算法思路: 第 1 趟,在待排序記錄 r1 ~ r[n]中選出最小的記錄,將它與 r1 交換;第 2 趟, 在待排序記錄 r2 ~ r[n]中選出最小的記錄,將它與 r2 交換;以此類推,第 i 趟在待排序 記錄 r[i] ~ r[n]中選出最小的記錄,將它與
C語言中常用排序演算法(氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序)實現比較
以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法