1.快速排序
(1)基本思想:選擇一個基準元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞歸地排序劃分的兩部分。
(2)實例:
(3)用java實現
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //將中間的這個數和第一個數交換 參見注1
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 從右向左找第一個小於x的數
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 從左向右找第一個大於等於x的數
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 遞歸調用
quick_sort(s, i + 1, r);
}
}
2.直接插入排序
//插入排序,假設第n個數之前的數都已經排好序了,對第n個數進行排序時會跟前面的數進行比較,
//將比這個數大的數都整體往後移動一個位置
public static void main(String[] args) {
int a[]={49,38,65,97,76,13,27,49,78,34};
int temp=0;
for (int i = 1; i < a.length; i++) {
int j=i-1;
temp=a[i];
for(;j >= 0 && a[j] > temp;j--){
a[j+1]=a[j];
}
a[j+1]=temp;
}
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
}
3.希爾排序(最小增量排序)
//算法先將要排序的一組數按某個增量d(n/2,n爲要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,
//然後再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。以此類推直到增量減到1時,進行直接插入排序後,跳出循環排序完成。
public static void main(String[] args) {
int a[]={49,38,65,97,76,13,27,49,78,34};
double d=a.length;
while(true){
d=Math.ceil(d/2);
int d1=(int)d;
int temp=0;
for (int i = 1; i < a.length; i+=d1) {
int j=i-d1;
temp=a[i];
for(;j>=0&&a[j]>temp;j-=d1){
a[j+d1]=a[j];
}
a[j+d1]=temp;
}
if(d1==1){
break;
}
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
4.簡單選擇排序
//在數組中選出最小的放在數組第一個,接着選出第二小的放在第二個,以此類推進行排序
public static void main(String[] args) {
int a[]={49,38,65,97,76,13,27,49,78,34};
for (int i = 0; i < a.length; i++) {
int j=i+1;
int temp=a[i];
int position = i;
for(;j<a.length;j++){
if(a[j]<a[i]){
a[i]=a[j];
position=j;
}
}
a[position]=temp;
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
5.冒泡排序
//在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,
//讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
public static void main(String[] args) {
int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
int temp=0;
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}