總結一些演算法的實現:
交換排序*****
1.冒泡演算法
typedef struct arr1
arr1;
void bubblesort(arr1 goal, int n)
} if (!flag) // m沒有交換時證明排玩了,跳出迴圈結束排序。
return;
}}
2.快速排序
//時間複雜度為o(nlog2n),空間複雜度為o(log2n);
void quicksort(arr1 goal, int s, int t)
goal[i] = goal[j];
while (i < j && goal[i].key < tmp.key) //把大於中心標誌的數拋到右邊
goal[j] = goal[i];
} goal[i] = tmp; // 當i = j時跳出迴圈,這時i和前面的某個值是一樣的,
//把他換為tmp的中心標誌,這樣一輪的替換完成,左邊小於tmp,右邊大於tmp
quicksort(goal, s, i - 1); //對左區間遞迴
quicksort(goal, i + 1, t); //對右區間遞迴
}}
插入排序*****
3.直接插入
//該演算法的時間複雜度最壞的情況是倒序時的o(n2),最好是正序時的o(n);其平均複雜度是o(n2)
void insertsort1(arr1 goal, int n)
goal[j + 1] = tmp; //向有序區插入
}}
4.希爾排序
//直接排序法的一種,時間複雜度一般認為是o(n1.3),一般是最後一趟出有序區,他是不穩定的排序(還沒有想向出他的插入圖)
void insertsort3(arr1 goal, int n)
goal[j + gap] = tmp; //向有序區插入
} gap = gap / 2; //減小增量
}}
選擇排序*****
5.直接選擇
//和冒泡差不多,就是把排序放到外迴圈,使得可以定乙個需要的有序區。
void selectsort(arr1 goal, int n)
} if (k != i) //排序
}}
6.歸併排序
//2路歸併排序
void merge(arr1 goal, int low, int mid, int hight)
else //將第二段複製到r1
}while (i <= mid) //將第一段餘下部分複製到r1
while (j <= hight) //將第二段餘下部分複製到r1
for (k = 0, i = low; i <= hight; k++, i++) //將r1複製會goal中
delete r1;
}void mergepass(arr1 goal, int lenght, int n) //對整個表進行歸併
if (i + lenght - 1 < n) //餘下這2個表的長度,後者小於lenght,歸併這2個表 }
//二路歸併排序
void mergesort(arr1 goal, int n)
}
資料結構 內部排序
內部排序演算法 時間複雜度 o n 2 o n 2 o n 2 空間複雜度 o 1 o 1 o 1 演算法名稱 插入 選擇 冒泡 演算法名稱 希爾 堆 快速 歸併 基數 空間複雜度 o 1 o 1 o logn o n o 2rd 時間複雜度 o nlogn o nlogn o nlogn o nl...
資料結構6 2內部排序
假設含n個記錄的序列為 其對應的關鍵字序列為 這些關鍵字的排列方式有多種,其中至少有一種排列方式能使得關鍵字之間存在著這樣乙個關係 kp1 kp2 kpn 按此關係將記錄序列重新排列為 即為有序記錄,將這一過程稱為排序。若在乙個記錄序列中ki kj,且在排序前的序列中ri領先於rj。若在排序後的序列...
資料結構 內部排序之氣泡排序
1.基本思想 每次比較兩個相鄰的元素,如果他們的順序錯誤就把他們交換過來 2.具體做法 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越...