資料結構和演算法(排序)

2021-09-25 22:58:38 字數 4601 閱讀 5948

排序:使乙個無序序列轉變為有序序列的過程

排序的穩定性:

假設ki = kj, (1<= i <= n, 1<= j <= n, i != j),且在排序前的序列中ri領先於rj(即i如果排序後ri仍領先於rj,則稱所用的排序方法是穩定的,否則是不穩定的

影響排序演算法效能的幾個要素:

時間效能,輔助空間、演算法的複雜性

氣泡排序:每次取相鄰兩個數做比較,並在符合交換條件時交換,直到整個陣列均符合條件

#include #include void print(int *k, int n)}}

print(k, n);

printf("此次共進行了%d次比較,%d次移動~\n", count1, count2);

}//正宗的氣泡排序演算法(從下往上冒)

void truebubblesort(int *k, int n)}}

print(k, n);

printf("此次共進行了%d次比較,%d次移動~\n", count1, count2);

}//正宗的氣泡排序演算法優化

void bettertruebubblesort(int *k, int n)}}

print(k, n);

printf("此次共進行了%d次比較,%d次移動~\n", count1, count2);

}int main()

; //int b[10] = ;

//int c[10] = ;

int n = 10;

print(a, n);

printf("\n不正宗的氣泡排序:\n\n");

bubblesort(a, n);

printf("\n正宗的氣泡排序:\n\n");

truebubblesort(a, n);

printf("\n正宗的氣泡排序優化:\n\n");

bettertruebubblesort(a, n);

return 0;

}

選擇排序(一般比氣泡排序效率高):在陣列中每次選取最大或最小的數移到最前面(迭代範圍依次減1),直到陣列有序

#include void print(int *k, int n)

k[j+1] = temp;}}

print(k, n);

}int main(void)

; int a[10] = ;

int n = 10;

print(a, n);

printf("\n直接插入排序:\n\n");

insertsort(a, n);

return 0;

}

希爾排序:時間複雜度(n*logn)每次排序取一定的間隔對子陣列進行比較,期間間隔不斷縮小直至為1

#include #include void print(int *k, int n)

k[j+gap] = temp;}}

}while(gap > 1);

print(k, n);

}int main(void)

; int a[10] = ;

int n = 10;

print(a, n);

printf("\n希爾排序:\n\n");

insertsort(a, n);

return 0;

}

堆排序:利用堆進行排序,將待排序的序列構造成堆(大頂堆或小頂堆),求最大值時取堆頂元素與末尾元素交換,再將剩餘的元素重新構造成堆,重複上述操作,直至排序完成

#include #include int count = 0;

void print(int *k, int n)

printf("\n");

}void swap(int *k, int i, int j)

void heapadjust(int *k, int s, int n)

if(temp >= k[i])

k[s] = k[i];

s = i;

}k[s] = temp;

}void heapsort(int *k, int n)

for(i=n; i>1; i--)

print(k, n);

}int main(void)

; int n = 9;

print(a, n);

printf("\n堆排序:\n\n");

heapsort(a, n);

printf("總共進行%d次比較~\n", count);

return 0;

}

歸併排序:

2路歸併排序:將有n個記錄的序列看成是擁有n個有序的子串行,每個子串行長度為1,然後兩兩歸併,得到n/2個長度為2的有序子串行,在兩兩歸併,依此類推,直到得到長度為n的有序序列

#include #include #define maxsize 10

//列印陣列

void print(int *k, int n)

}int main(void)

; int n = 10;

print(a, n);

printf("\n堆排序:\n\n");

mergesort(a, n);

print(a, n);

return 0;

}

#include #include #define maxsize 10

//列印陣列

void print(int *k, int n)

next = 0;

while(left_min < left_max && right_min < right_max)

else

}//當左區間存在較大值時,將剩下的值放到右區間最右處

while(left_min < left_max)

//將暫存在temp空間中的已排序序列放回原陣列中

while(next > 0)}}

}int main(void)

; int n = 10;

print(a, n);

printf("\n堆排序:\n\n");

mergesort(a, n);

print(a, n);

return 0;

}

快速排序:

#include #include #define maxsize 10

//列印陣列

void print(int *k, int n)

swap(k, low, high);

while(low < high && k[low] <= point)

swap(k, low, high);

}return low;

}void qsort(int *k, int low, int high)

}//快速排序

void quicksort(int *k, int n)

int main(void)

; int n = 10;

print(a, n);

printf("\n快速排序:\n\n");

quicksort(a, n);

print(a, n);

return 0;

}

快速排序演算法優化:

1.優化選取基準點:三數取中法,從序列中任意取三個數取中間的值作為基準點

2.優化掉不必要的交換:

3.優化小陣列時的排序方案:待插入陣列規模小,直接插入;大規模,快速排序(有遞迴)

4.優化遞迴操作:

優化示例:

/*快速排序演算法的優化(三數取中法)*/

#include #include #define maxsize 10

//列印陣列

void print(int *k, int n)

if(k[m] > k[high])

if(k[m] > k[low])

point = k[low];

while(low < high)

swap(k, low, high);

while(low < high && k[low] <= point)

swap(k, low, high);

}return low;

}void qsort(int *k, int low, int high)

}//快速排序

void quicksort(int *k, int n)

int main(void)

; int n = 10;

print(a, n);

printf("\n快速排序:\n\n");

quicksort(a, n);

print(a, n);

return 0;

}

排序演算法:

1.插入排序類:直接插入排序,希爾排序

2.選擇排序類:選擇排序、堆排序

3.交換排序類:氣泡排序,快速排序

4.歸併排序類:歸併排序

各排序演算法特點:

資料結構和演算法 排序

一 簡單排序 1.氣泡排序o n 2 兩兩比較,反序交換 public static int bubblesort int arr return arr 2.選擇排序o n 2 public static int selectsort int arr if i minindex return arr...

資料結構和演算法 排序演算法 希爾排序

希爾排序 希爾排序 希爾排序就是插入排序的一種改進版本,演算法的步驟 把乙個序列不視為乙個整體,而是視為多個子串行,假設間隔是gap 4 alist 54,26,93,17,77,31,44,55,20 54,26,93,17,77,31,44,55,20 54 77 20 這是1 組,間隔是4,2...

資料結構和演算法 排序演算法 氣泡排序

排序演算法 排序演算法,我們想要把線性表中的無序序列,排成有序序列,的演算法,就是排序演算法,排序演算法的穩定性 舉例 假設對下面的元組要以他們的第乙個數字來排序。4,1 3,1 3,7 5,6 如果你排序之後,3,1 3,7 和原來的順序一樣,就是穩定的,否則就是不穩定的,3,1 3,7 4,1 ...