排序演算法的執行時間是衡量演算法好壞的最重要的引數。排序的時間開銷可用演算法執行中的資料比較次數與資料移動次數來衡量。
1、氣泡排序演算法
void bubblesort(int a, int n)
} if(!ischange) break;
}}
2、插入排序演算法
void insertsort(int a, int n)
} }}
3、希爾排序演算法該方法的基本思想:設待排序元素序列有n個元素,首先取乙個整數gap < n作為間隔,將全部元素分為gap個子序列,所有距離為gap的元素放在同乙個子串行中,在每乙個子串行中分別施行直接插入排序。然後縮小間隔gap,例如取gap = gap / 2上取整,重複上述的子串行劃分和排序工作。直到最後取gap = 1,將所有元素放在同乙個序列中為止。希爾排序是不穩定的排序演算法。void shellsort(int a, int n)
}} }while(gap > 1);
}
4、快速排序演算法快速排序演算法是不穩定的排序演算法,在一定情況下退化比較快。
方法一:
int partation(int a, int left, int right)
a[low] = piovt;
return low;
}
方法二:
int partation(int a, int left, int right)
} swap(a[i], a[left]); //目標數以最左邊的數開始的情況
return i;
}
方法三:
int partation(int a, int left, int right)
} swap(a[i + 1], a[right]); //目標數以最右邊數開始的情況
return i + 1;
}
void quicksort(int a, int left, int right)
}
5、歸併排序演算法
void merge(int a, int left, int mid, int right)else
tmp++;
} while(i)
while(j)
delete ls;
delete rs;
}
void mergesort(int a, int left, int right)
}
6、堆排序演算法
一種不穩定的排序演算法
/*
* @brief: 最大化堆調整
* @param: p調整的基準點,n當前堆大小
*/void maxheapify(int a, int p, int n)
if(rhs < n && a[larger] < a[rhs])
if(larger != p)
}/*
* @brief: 最大化堆
*/void buildmaxheap(int a, int n)
}/*
* @brief: 堆排序
*/void heapsort(int a, int n)
}
7、線性排序演算法
計數排序 假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。當k = o(n)時,計數排序的執行時間為0(n).計數排序的基本思想就是對每乙個輸入元素x,確定出小於x的元素個數。有了這一資訊,就可以把直接放到它在最終輸出陣列中的位置上。//b是從0下標開始的
void countingsort(int a, int b, int n , int c, int m)
for(int i = 1; i < m; ++i)
for(int i = n - 1; i >= 0; i--)
}
排序演算法小結
1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...
排序演算法小結
1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...
排序演算法小結
演算法過程 假設乙個無序的序列,該演算法將其分成兩部分,前一部分已經完成排序 有序,一開始時只有乙個元素 後一部分任然無序,將後面序列選擇第乙個插入到前面的有序序列,如此直到所有完全有序。複雜度 最簡單的即為,整個序列原來即有序,按照一種最 省事 的方式,我們僅需比較n 1次即可。最複雜的情況,應該...